diff --git a/package-lock.json b/package-lock.json index 10c87aa61..e01011da6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "license": "MIT", "dependencies": { "@tanstack/angular-table": "^8.21.4", - "@tedi-design-system/core": "6.11.2" + "@tedi-design-system/core": "6.12.0" }, "devDependencies": { "@angular-devkit/build-angular": "20.3.27", @@ -12914,9 +12914,10 @@ } }, "node_modules/@tedi-design-system/core": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/@tedi-design-system/core/-/core-6.11.2.tgz", - "integrity": "sha512-iYKcXyJV1KJCpcjwxN4bQVTi9jnIkvp/5bUtR8jRes2BMvTpx7PKuoFnOnjiBZmRpm2hhgiqzhP/SpvwJCRR9A==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@tedi-design-system/core/-/core-6.12.0.tgz", + "integrity": "sha512-TOiT+zll/sQUz89xhSglBrPrfs62PU5/1c8Sh+aWxzHsu8yhqDNbBE3UaKCoPjNN8OkaY/zxETQbYAvHb1cFuw==", + "license": "MIT", "engines": { "node": ">=24.0.0", "npm": ">=11.0.0" diff --git a/package.json b/package.json index f1b614331..7c24a02f0 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ }, "dependencies": { "@tanstack/angular-table": "^8.21.4", - "@tedi-design-system/core": "6.11.2" + "@tedi-design-system/core": "6.12.0" }, "devDependencies": { "@angular-devkit/build-angular": "20.3.27", diff --git a/src/community/components/form/checkbox/checkbox/checkbox.component.scss b/src/community/components/form/checkbox/checkbox/checkbox.component.scss index cc214cdf6..a7bf3d30d 100644 --- a/src/community/components/form/checkbox/checkbox/checkbox.component.scss +++ b/src/community/components/form/checkbox/checkbox/checkbox.component.scss @@ -1,6 +1,6 @@ .tedi-checkbox { - --_checkbox-bg: var(--form-checkbox-radio-default-background-default); - --_checkbox-border: var(--form-checkbox-radio-default-border-default); + --_checkbox-bg: var(--form-choice-checkbox-unselected-default); + --_checkbox-border: var(--form-choice-checkbox-unselected-border-default); --_checkbox-label-color: var(--general-text-primary); --_checkbox-check-color: var(--_checkbox-border); --_checkbox-inner-spacing: var(--form-checkbox-radio-inner-spacing); @@ -55,20 +55,23 @@ } &:has(input:checked, input:indeterminate) { - --_checkbox-bg: var(--form-checkbox-radio-default-background-selected); - --_checkbox-border: var(--form-checkbox-radio-default-border-selected); + --_checkbox-bg: var(--form-choice-checkbox-selected-default); + --_checkbox-border: var(--form-choice-checkbox-selected-border-default); } &:has(input:hover, input:focus-visible) { .tedi-checkbox__indicator { outline: 1px solid var(--_checkbox-border); } - --_checkbox-border: var(--form-checkbox-radio-default-border-hover); + --_checkbox-border: var(--form-choice-checkbox-unselected-border-hover); } &:has(input:active) { - --_checkbox-border: var(--form-checkbox-radio-default-border-active); - --_checkbox-bg: var(--form-checkbox-radio-default-background-active); + --_checkbox-border: var(--form-choice-checkbox-unselected-border-active); + } + + &:has(input:checked:active, input:indeterminate:active) { + --_checkbox-bg: var(--form-choice-checkbox-selected-active); } &:has(input:disabled) { @@ -78,17 +81,14 @@ --_checkbox-border: var(--form-input-border-disabled); } - &:has(input:disabled:checked) { - --_checkbox-bg: var( - --form-checkbox-radio-default-background-selected-disabled - ); - --_checkbox-border: var( - --form-checkbox-radio-default-border-selected-disabled - ); + &:has(input:disabled:checked, input:disabled:indeterminate) { + --_checkbox-bg: var(--form-choice-checkbox-selected-disabled); + --_checkbox-border: var(--form-choice-checkbox-selected-border-disabled); } - &--error { - --_checkbox-bg: var(--form-checkbox-radio-default-background-error); + // Error colours apply to unselected boxes only; selected ones keep their fill + &--error:has(input:not(:checked, :indeterminate, :disabled)) { + --_checkbox-bg: var(--form-choice-checkbox-unselected-default); --_checkbox-border: var(--form-general-feedback-error-border); } diff --git a/src/community/components/form/choicegroup/_choicegroup-card-mixins.scss b/src/community/components/form/choicegroup/_choicegroup-card-mixins.scss index 10369a9fa..47b148d05 100644 --- a/src/community/components/form/choicegroup/_choicegroup-card-mixins.scss +++ b/src/community/components/form/choicegroup/_choicegroup-card-mixins.scss @@ -21,74 +21,85 @@ @mixin color-variables($variant) { :is(.tedi-radio, .tedi-checkbox) { --_choicegroup-card-bg: var( - --form-checkbox-radio-card-#{$variant}-default-background + --form-choice-card-#{$variant}-unselected-background-default ); --_radio-label-color: var( - --form-checkbox-radio-card-#{$variant}-default-text + --form-choice-card-#{$variant}-unselected-text-default ); --_checkbox-label-color: var( - --form-checkbox-radio-card-#{$variant}-default-text + --form-choice-card-#{$variant}-unselected-text-default ); &:has(input:checked) { --_choicegroup-card-bg: var( - --form-checkbox-radio-card-#{$variant}-selected-background + --form-choice-card-#{$variant}-selected-background-default ); --_radio-label-color: var( - --form-checkbox-radio-card-#{$variant}-selected-text + --form-choice-card-#{$variant}-selected-text-default ); --_checkbox-label-color: var( - --form-checkbox-radio-card-#{$variant}-selected-text + --form-choice-card-#{$variant}-selected-text-default ); } &:has(input:hover) { --_choicegroup-card-bg: var( - --form-checkbox-radio-card-#{$variant}-hover-background + --form-choice-card-#{$variant}-unselected-background-hover ); --_radio-label-color: var( - --form-checkbox-radio-card-#{$variant}-hover-text + --form-choice-card-#{$variant}-unselected-text-hover ); --_checkbox-label-color: var( - --form-checkbox-radio-card-#{$variant}-hover-text + --form-choice-card-#{$variant}-unselected-text-hover ); } &:has(input:disabled) { --_choicegroup-card-bg: var( - --form-checkbox-radio-card-#{$variant}-disabled-background + --form-choice-card-#{$variant}-unselected-background-disabled ); --_radio-label-color: var( - --form-checkbox-radio-card-#{$variant}-disabled-text + --form-choice-card-#{$variant}-unselected-text-disabled ); --_checkbox-label-color: var( - --form-checkbox-radio-card-#{$variant}-disabled-text + --form-choice-card-#{$variant}-unselected-text-disabled ); } } } @mixin border-colors($variant, $border-type) { + $unselected-border: if( + $border-type == "border-separate", + "border-borderless", + "border-default" + ); + $selected-border: if( + $border-type == "border-separate", + "background-default", + "border-default" + ); + :is(.tedi-radio, .tedi-checkbox) { --_choicegroup-card-border: var( - --form-checkbox-radio-card-#{$variant}-default-#{$border-type} + --form-choice-card-#{$variant}-unselected-#{$unselected-border} ); &:has(input:checked) { --_choicegroup-card-border: var( - --form-checkbox-radio-card-#{$variant}-selected-#{$border-type} + --form-choice-card-#{$variant}-selected-#{$selected-border} ); } &:has(input:hover) { --_choicegroup-card-border: var( - --form-checkbox-radio-card-#{$variant}-hover-border + --form-choice-card-#{$variant}-unselected-border-hover ); } &:has(input:disabled) { --_choicegroup-card-border: var( - --form-checkbox-radio-card-#{$variant}-disabled-#{$border-type} + --form-choice-card-#{$variant}-unselected-border-disabled ); } } diff --git a/src/community/components/form/choicegroup/choicegroup.styles.scss b/src/community/components/form/choicegroup/choicegroup.styles.scss index 66cb24c4b..7b0b3d83a 100644 --- a/src/community/components/form/choicegroup/choicegroup.styles.scss +++ b/src/community/components/form/choicegroup/choicegroup.styles.scss @@ -3,7 +3,7 @@ @mixin choicegroup-card-error-variables { :is(.tedi-radio--error, .tedi-checkbox--error) { - --_choicegroup-card-bg: var(--form-checkbox-radio-default-background-error); + --_choicegroup-card-bg: var(--form-general-background-default); --_choicegroup-card-border: var(--form-general-feedback-error-border); } } @@ -35,18 +35,12 @@ :is(.tedi-radio, .tedi-checkbox):has(input:checked) { --_radio-bg: transparent; --_checkbox-bg: transparent; - --_radio-border: var( - --form-checkbox-radio-default-border-selected-inverted - ); - --_checkbox-border: var( - --form-checkbox-radio-default-border-selected-inverted - ); + --_radio-border: var(--form-choice-checkbox-selected-border-inverted); + --_checkbox-border: var(--form-choice-checkbox-selected-border-inverted); } .tedi-checkbox:has(input:active) { - --_checkbox-border: var( - --form-checkbox-radio-default-border-selected-inverted - ); + --_checkbox-border: var(--form-choice-checkbox-selected-border-inverted); } &.tedi-choicegroup--stacked { diff --git a/src/community/components/form/radio/radio/radio.component.scss b/src/community/components/form/radio/radio/radio.component.scss index 3c68bc0db..462e99b2b 100644 --- a/src/community/components/form/radio/radio/radio.component.scss +++ b/src/community/components/form/radio/radio/radio.component.scss @@ -1,6 +1,6 @@ .tedi-radio { - --_radio-bg: var(--form-checkbox-radio-default-background-default); - --_radio-border: var(--form-checkbox-radio-default-border-default); + --_radio-bg: var(--form-choice-radio-unselected-background-default); + --_radio-border: var(--form-choice-radio-unselected-border-default); --_radio-label-color: var(--general-text-primary); --_radio-dot-bg: var(--_radio-border); --_radio-dot-size: 12px; @@ -63,18 +63,18 @@ .tedi-radio__indicator::after { display: block; } - --_radio-border: var(--form-checkbox-radio-default-border-selected); + --_radio-border: var(--form-choice-radio-selected-border-default); } &:has(input:hover, input:focus-visible) { .tedi-radio__indicator { outline: 1px solid var(--_radio-border); } - --_radio-border: var(--form-checkbox-radio-default-border-hover); + --_radio-border: var(--form-choice-radio-unselected-border-hover); } &:has(input:active) { - --_radio-border: var(--form-checkbox-radio-default-border-active); + --_radio-border: var(--form-choice-radio-unselected-border-active); } &:has(input:disabled) { @@ -85,16 +85,12 @@ } &:has(input:disabled:checked) { - --_radio-dot-bg: var( - --form-checkbox-radio-default-background-selected-disabled - ); - --_radio-border: var( - --form-checkbox-radio-default-border-selected-disabled - ); + --_radio-dot-bg: var(--form-choice-radio-selected-indicator-disabled); + --_radio-border: var(--form-choice-radio-selected-border-disabled); } &--error { - --_radio-bg: var(--form-checkbox-radio-default-background-error); + --_radio-bg: var(--form-choice-radio-unselected-background-default); --_radio-border: var(--form-general-feedback-error-border); } diff --git a/src/community/components/navigation/vertical-stepper/vertical-stepper-item/vertical-stepper-item.component.scss b/src/community/components/navigation/vertical-stepper/vertical-stepper-item/vertical-stepper-item.component.scss index 2215c69c8..aeeee7dd7 100644 --- a/src/community/components/navigation/vertical-stepper/vertical-stepper-item/vertical-stepper-item.component.scss +++ b/src/community/components/navigation/vertical-stepper/vertical-stepper-item/vertical-stepper-item.component.scss @@ -248,7 +248,7 @@ } &--disabled { - --_step-indicator-background: var(--stepper-step-disabled-bg, #d2d3d8); + --_step-indicator-background: var(--stepper-step-disabled-background, #d2d3d8); --_step-indicator-color: var( --stepper-item-vertical-text-disabled, #9293a4 @@ -261,7 +261,7 @@ } &--informative { - --_step-indicator-background: var(--stepper-step-disabled-bg, #d2d3d8); + --_step-indicator-background: var(--stepper-step-disabled-background, #d2d3d8); --_step-indicator-border: var(--stepper-step-disabled-border, #9293a4); --_step-title-color: var(--general-text-tertiary, #5d6071); #{$host-class}__title { diff --git a/src/community/text-editor/text-editor.component.scss b/src/community/text-editor/text-editor.component.scss index 4036f4a30..c63e1a56b 100644 --- a/src/community/text-editor/text-editor.component.scss +++ b/src/community/text-editor/text-editor.component.scss @@ -91,7 +91,7 @@ border-radius: var(--tedi-radius-02-default); &:hover { - background-color: var(--general-surface-hover); + background-color: var(--general-state-hover); } &.ql-active { diff --git a/src/tedi/components/buttons/button/button.component.scss b/src/tedi/components/buttons/button/button.component.scss index 98a4106b1..0230b0102 100644 --- a/src/tedi/components/buttons/button/button.component.scss +++ b/src/tedi/components/buttons/button/button.component.scss @@ -51,18 +51,18 @@ } &--primary-button-group { - --_btn-text: var(--button-group-primary-inactive-text); - --_btn-bg: var(--button-group-primary-inactive-background); - --_btn-border: var(--button-group-primary-inactive-border); + --_btn-text: var(--button-group-primary-unselected-text); + --_btn-bg: var(--button-group-primary-unselected-background); + --_btn-border: var(--button-group-primary-unselected-border); --_btn-hover-text: var(--button-group-primary-hover-text); --_btn-hover-bg: var(--button-group-primary-hover-background); --_btn-hover-border: var(--button-group-primary-hover-border); --_btn-active-text: var(--button-group-primary-selected-text); --_btn-active-bg: var(--button-group-primary-selected-background); --_btn-active-border: var(--button-group-primary-selected-border); - --_btn-focus-text: var(--button-group-primary-inactive-text); - --_btn-focus-bg: var(--button-group-primary-inactive-background); - --_btn-focus-border: var(--button-group-primary-inactive-border); + --_btn-focus-text: var(--button-group-primary-unselected-text); + --_btn-focus-bg: var(--button-group-primary-unselected-background); + --_btn-focus-border: var(--button-group-primary-unselected-border); --_btn-disabled-text: var(--button-group-primary-disabled-text); --_btn-disabled-bg: var(--button-group-primary-disabled-background); --_btn-disabled-border: var(--button-group-primary-disabled-border); @@ -79,18 +79,18 @@ } &--secondary-button-group { - --_btn-text: var(--button-group-secondary-inactive-text); - --_btn-bg: var(--button-group-secondary-inactive-background); - --_btn-border: var(--button-group-secondary-inactive-border); + --_btn-text: var(--button-group-secondary-unselected-text); + --_btn-bg: var(--button-group-secondary-unselected-background); + --_btn-border: var(--button-group-secondary-unselected-border); --_btn-hover-text: var(--button-group-secondary-hover-text); --_btn-hover-bg: var(--button-group-secondary-hover-background); --_btn-hover-border: var(--button-group-secondary-hover-border); --_btn-active-text: var(--button-group-secondary-selected-text); --_btn-active-bg: var(--button-group-secondary-selected-background); --_btn-active-border: var(--button-group-secondary-selected-border); - --_btn-focus-text: var(--button-group-secondary-inactive-text); - --_btn-focus-bg: var(--button-group-secondary-inactive-background); - --_btn-focus-border: var(--button-group-secondary-inactive-border); + --_btn-focus-text: var(--button-group-secondary-unselected-text); + --_btn-focus-bg: var(--button-group-secondary-unselected-background); + --_btn-focus-border: var(--button-group-secondary-unselected-border); --_btn-disabled-text: var(--button-group-secondary-disabled-text); --_btn-disabled-bg: var(--button-group-secondary-disabled-background); --_btn-disabled-border: var(--button-group-secondary-disabled-border); diff --git a/src/tedi/components/content/accordion/accordion-item-header/accordion-item-header.component.scss b/src/tedi/components/content/accordion/accordion-item-header/accordion-item-header.component.scss index 60a3ed921..65ab42fca 100644 --- a/src/tedi/components/content/accordion/accordion-item-header/accordion-item-header.component.scss +++ b/src/tedi/components/content/accordion/accordion-item-header/accordion-item-header.component.scss @@ -26,7 +26,7 @@ cursor: pointer; &:hover { - background: var(--general-surface-hover); + background: var(--general-state-hover); } &:active { diff --git a/src/tedi/components/content/accordion/accordion.stories.ts b/src/tedi/components/content/accordion/accordion.stories.ts index 9d3ce1436..a5f81576a 100644 --- a/src/tedi/components/content/accordion/accordion.stories.ts +++ b/src/tedi/components/content/accordion/accordion.stories.ts @@ -1175,7 +1175,7 @@ hasn't met yet (incomplete prerequisites, missing permissions, etc.). .step-number--disabled { border-color: var(--stepper-step-disabled-border); - background: var(--stepper-step-disabled-bg); + background: var(--stepper-step-disabled-background); } .step-body { diff --git a/src/tedi/components/content/calendar/calendar-month-grid/calendar-month-grid.component.scss b/src/tedi/components/content/calendar/calendar-month-grid/calendar-month-grid.component.scss index fb4aa1fef..94a06716b 100644 --- a/src/tedi/components/content/calendar/calendar-month-grid/calendar-month-grid.component.scss +++ b/src/tedi/components/content/calendar/calendar-month-grid/calendar-month-grid.component.scss @@ -23,17 +23,17 @@ padding: var(--form-checkbox-radio-card-radio-padding-y) var(--form-checkbox-radio-card-radio-padding-x); font-size: var(--body-regular-size); - color: var(--form-checkbox-radio-card-primary-default-text); + color: var(--form-choice-card-primary-unselected-text-default); cursor: pointer; - background: var(--form-checkbox-radio-card-secondary-default-background); + background: var(--form-choice-card-secondary-unselected-background-default); border: var(--tedi-borders-01) solid - var(--form-checkbox-radio-card-secondary-default-border); + var(--form-choice-card-secondary-unselected-border-default); border-radius: var(--form-checkbox-radio-card-radius); &:hover { - color: var(--form-checkbox-radio-card-secondary-hover-text); - background: var(--form-checkbox-radio-card-secondary-hover-background); - border-color: var(--form-checkbox-radio-card-secondary-hover-border); + color: var(--form-choice-card-secondary-unselected-text-hover); + background: var(--form-choice-card-secondary-unselected-background-hover); + border-color: var(--form-choice-card-secondary-unselected-border-hover); } &:focus-visible { @@ -46,36 +46,34 @@ } &--selected { - color: var(--form-checkbox-radio-card-secondary-selected-text); - background: var(--form-checkbox-radio-card-secondary-selected-background); - border-color: var(--form-checkbox-radio-card-secondary-selected-border); + color: var(--form-choice-card-secondary-selected-text-default); + background: var(--form-choice-card-secondary-selected-background-default); + border-color: var(--form-choice-card-secondary-selected-border-default); box-shadow: 0 0 0 1px - var(--form-checkbox-radio-card-secondary-selected-border); + var(--form-choice-card-secondary-selected-border-default); } &--disabled, &[aria-disabled="true"] { - color: var(--form-checkbox-radio-card-secondary-disabled-default-text); + color: var(--form-choice-card-secondary-unselected-text-disabled); pointer-events: none; cursor: not-allowed; background: var( - --form-checkbox-radio-card-secondary-disabled-default-background + --form-choice-card-secondary-unselected-background-disabled ); border-color: var( - --form-checkbox-radio-card-secondary-disabled-default-border + --form-choice-card-secondary-unselected-border-disabled ); } &--selected#{&}--disabled { - color: var(--form-checkbox-radio-card-secondary-disabled-selected-text); + color: var(--form-choice-card-secondary-selected-text-disabled); background: var( - --form-checkbox-radio-card-secondary-disabled-selected-background - ); - border-color: var( - --form-checkbox-radio-card-secondary-disabled-selected-border + --form-choice-card-secondary-selected-background-disabled ); + border-color: var(--form-choice-card-secondary-selected-border-disabled); box-shadow: 0 0 0 1px - var(--form-checkbox-radio-card-secondary-disabled-selected-border); + var(--form-choice-card-secondary-selected-border-disabled); } } } diff --git a/src/tedi/components/content/calendar/calendar-year-grid/calendar-year-grid.component.scss b/src/tedi/components/content/calendar/calendar-year-grid/calendar-year-grid.component.scss index 773575480..778c9d01e 100644 --- a/src/tedi/components/content/calendar/calendar-year-grid/calendar-year-grid.component.scss +++ b/src/tedi/components/content/calendar/calendar-year-grid/calendar-year-grid.component.scss @@ -23,17 +23,17 @@ padding: var(--form-checkbox-radio-card-radio-padding-y) var(--form-checkbox-radio-card-radio-padding-x); font-size: var(--body-regular-size); - color: var(--form-checkbox-radio-card-primary-default-text); + color: var(--form-choice-card-primary-unselected-text-default); cursor: pointer; - background: var(--form-checkbox-radio-card-secondary-default-background); + background: var(--form-choice-card-secondary-unselected-background-default); border: var(--tedi-borders-01) solid - var(--form-checkbox-radio-card-secondary-default-border); + var(--form-choice-card-secondary-unselected-border-default); border-radius: var(--form-checkbox-radio-card-radius); &:hover { - color: var(--form-checkbox-radio-card-secondary-hover-text); - background: var(--form-checkbox-radio-card-secondary-hover-background); - border-color: var(--form-checkbox-radio-card-secondary-hover-border); + color: var(--form-choice-card-secondary-unselected-text-hover); + background: var(--form-choice-card-secondary-unselected-background-hover); + border-color: var(--form-choice-card-secondary-unselected-border-hover); } &:focus-visible { @@ -46,36 +46,34 @@ } &--selected { - color: var(--form-checkbox-radio-card-secondary-selected-text); - background: var(--form-checkbox-radio-card-secondary-selected-background); - border-color: var(--form-checkbox-radio-card-secondary-selected-border); + color: var(--form-choice-card-secondary-selected-text-default); + background: var(--form-choice-card-secondary-selected-background-default); + border-color: var(--form-choice-card-secondary-selected-border-default); box-shadow: 0 0 0 1px - var(--form-checkbox-radio-card-secondary-selected-border); + var(--form-choice-card-secondary-selected-border-default); } &--disabled, &[aria-disabled="true"] { - color: var(--form-checkbox-radio-card-secondary-disabled-default-text); + color: var(--form-choice-card-secondary-unselected-text-disabled); pointer-events: none; cursor: not-allowed; background: var( - --form-checkbox-radio-card-secondary-disabled-default-background + --form-choice-card-secondary-unselected-background-disabled ); border-color: var( - --form-checkbox-radio-card-secondary-disabled-default-border + --form-choice-card-secondary-unselected-border-disabled ); } &--selected#{&}--disabled { - color: var(--form-checkbox-radio-card-secondary-disabled-selected-text); + color: var(--form-choice-card-secondary-selected-text-disabled); background: var( - --form-checkbox-radio-card-secondary-disabled-selected-background - ); - border-color: var( - --form-checkbox-radio-card-secondary-disabled-selected-border + --form-choice-card-secondary-selected-background-disabled ); + border-color: var(--form-choice-card-secondary-selected-border-disabled); box-shadow: 0 0 0 1px - var(--form-checkbox-radio-card-secondary-disabled-selected-border); + var(--form-choice-card-secondary-selected-border-disabled); } } } diff --git a/src/tedi/components/form/checkbox-card-group/checkbox-card-group.component.scss b/src/tedi/components/form/checkbox-card-group/checkbox-card-group.component.scss index 84cc5c9e8..cb46b0e61 100644 --- a/src/tedi/components/form/checkbox-card-group/checkbox-card-group.component.scss +++ b/src/tedi/components/form/checkbox-card-group/checkbox-card-group.component.scss @@ -1,5 +1,7 @@ +// Cards keep their own content height by default; stretch them where equal heights are needed .tedi-checkbox-card-group { display: flex; flex-wrap: wrap; gap: var(--form-checkbox-radio-card-gutter); + align-items: flex-start; } diff --git a/src/tedi/components/form/checkbox-card/checkbox-card.component.scss b/src/tedi/components/form/checkbox-card/checkbox-card.component.scss index df9f34b78..acd599486 100644 --- a/src/tedi/components/form/checkbox-card/checkbox-card.component.scss +++ b/src/tedi/components/form/checkbox-card/checkbox-card.component.scss @@ -1,12 +1,24 @@ +$focus-ring: + 0 0 0 var(--tedi-borders-01) + var(--general-effect-colors-focus-outset-inner-shadow), + 0 0 0 var(--tedi-borders-03) + var(--general-effect-colors-focus-outset-outer-shadow); +$selected-border-inset: calc( + var(--general-border-width-selected) - var(--tedi-borders-01) +); + label[tedi-checkbox-card] { + --form-checkbox-radio-size-responsive: var(--form-checkbox-radio-size-fixed); --_card-bg: transparent; --_card-text: inherit; --_card-border: transparent; + --_card-inset: 0 0 0 0 transparent; + --_card-ring: 0 0 0 0 transparent; display: inline-flex; flex-direction: column; align-items: flex-start; - justify-content: center; + justify-content: flex-start; min-height: var(--form-field-height); padding: calc( var(--form-checkbox-radio-card-checkbox-padding-y) - var( @@ -20,8 +32,19 @@ label[tedi-checkbox-card] { color: var(--_card-text); cursor: pointer; background-color: var(--_card-bg); - border: 1px solid var(--_card-border); + border: var(--tedi-borders-01) solid var(--_card-border); border-radius: var(--form-checkbox-radio-card-radius); + box-shadow: var(--_card-inset), var(--_card-ring); + + &::before, + &::after { + flex: 1 1 0; + max-height: calc( + (var(--form-field-height) - var(--body-regular-line-height)) / + 2 - var(--form-checkbox-radio-card-checkbox-padding-y) + ); + content: ""; + } [tedi-text], tedi-icon { @@ -33,6 +56,16 @@ label[tedi-checkbox-card] { flex-shrink: 0; } + // The pointer always targets the card label, so the browser keeps forwarding + // hover and active to the input. If the input itself could be hovered, moving + // from the input back onto the card would drop the input's :hover and the + // card's hover styles with it. + input[tedi-checkbox] { + --_checkbox-icon-size: 1rem; + + pointer-events: none; + } + .tedi-checkbox-card__content { display: flex; gap: var(--form-checkbox-radio-card-inner-spacing); @@ -47,6 +80,15 @@ label[tedi-checkbox-card] { color: inherit; } + // An icon before the label pushes the label text right by the icon and one more + // gap, so the description lines up with the text instead of the icon + &:has(> .tedi-checkbox-card__content > tedi-icon) > .tedi-feedback-text { + padding-left: calc( + var(--form-checkbox-radio-size-responsive) + var(--icon-03) + + var(--form-checkbox-radio-card-inner-spacing) * 2 + ); + } + &.tedi-checkbox-card--hide-indicator { input[tedi-checkbox] { position: absolute; @@ -63,20 +105,20 @@ label[tedi-checkbox-card] { > .tedi-feedback-text { padding-left: 0; } - } - input[tedi-checkbox] { - &:not(:disabled):hover { - box-shadow: none; + &:has(> .tedi-checkbox-card__content > tedi-icon) > .tedi-feedback-text { + padding-left: calc( + var(--icon-03) + var(--form-checkbox-radio-card-inner-spacing) + ); } } + // The focus ring goes on the card, not on the indicator &:has(input:focus-visible) { - outline: var(--tedi-borders-02) solid var(--tedi-primary-500); - outline-offset: var(--tedi-borders-01); + --_card-ring: #{$focus-ring}; - input[tedi-checkbox]:focus-visible { - outline: none; + input[tedi-checkbox][type="checkbox"] { + --_checkbox-ring: 0 0 0 0 transparent; } } @@ -85,108 +127,170 @@ label[tedi-checkbox-card] { } &.tedi-checkbox-card--primary { - --_card-bg: var(--form-checkbox-radio-card-primary-default-background); - --_card-text: var(--form-checkbox-radio-card-primary-default-text); + --_card-bg: var(--form-choice-card-primary-unselected-background-default); + --_card-text: var(--form-choice-card-primary-unselected-text-default); --_card-border: var( - --form-checkbox-radio-card-primary-default-border-separate + --form-choice-card-primary-unselected-border-borderless ); + &:has(input:hover:not(:disabled, :checked)) { + --_card-bg: var(--form-choice-card-primary-unselected-background-hover); + --_card-text: var(--form-choice-card-primary-unselected-text-hover); + --_card-border: var(--form-choice-card-primary-unselected-border-hover); + } + + &:has(input:active:not(:disabled, :checked)) { + --_card-bg: var(--form-choice-card-primary-unselected-background-active); + --_card-text: var(--form-choice-card-primary-unselected-text-active); + --_card-border: var(--form-choice-card-primary-unselected-border-active); + } + + &:has(input:focus-visible:not(:hover, :active, :disabled, :checked)) { + --_card-bg: var(--form-choice-card-primary-unselected-background-focus); + --_card-text: var(--form-choice-card-primary-unselected-text-focus); + } + &:has(input:checked) { - --_card-bg: var(--form-checkbox-radio-card-primary-selected-background); - --_card-text: var(--form-checkbox-radio-card-primary-selected-text); - --_card-border: var( - --form-checkbox-radio-card-primary-selected-border-separate - ); + --_card-bg: var(--form-choice-card-primary-selected-background-default); + --_card-text: var(--form-choice-card-primary-selected-text-default); + --_card-border: var(--_card-bg); - input[tedi-checkbox]:not(:disabled) { - background-color: transparent; - border-color: var( - --form-checkbox-radio-default-border-selected-inverted + input[tedi-checkbox][type="checkbox"] { + --_checkbox-bg: var(--form-choice-inverted-indicator-default); + --_checkbox-border: var( + --form-choice-checkbox-selected-border-inverted + ); + --_checkbox-icon: var( + --form-choice-checkbox-selected-indicator-default ); } } - &:has(input:hover:not(:disabled)) { - --_card-bg: var(--form-checkbox-radio-card-primary-hover-background); - --_card-text: var(--form-checkbox-radio-card-primary-hover-text); - --_card-border: var(--form-checkbox-radio-card-primary-hover-border); + &:has(input:checked:hover:not(:disabled)) { + --_card-bg: var(--form-choice-card-primary-selected-background-hover); + --_card-text: var(--form-choice-card-primary-selected-text-hover); + + input[tedi-checkbox][type="checkbox"] { + --_checkbox-bg: var(--form-choice-inverted-indicator-hover); + } + } + + &:has(input:checked:active:not(:disabled)) { + --_card-bg: var(--form-choice-card-primary-selected-background-active); + --_card-text: var(--form-choice-card-primary-selected-text-active); + + input[tedi-checkbox][type="checkbox"] { + --_checkbox-bg: var(--form-choice-inverted-indicator-active); + } + } + + &:has(input:checked:focus-visible:not(:hover, :active, :disabled)) { + --_card-bg: var(--form-choice-card-primary-selected-background-focus); + --_card-text: var(--form-choice-card-primary-selected-text-focus); + + input[tedi-checkbox][type="checkbox"] { + --_checkbox-bg: var(--form-choice-inverted-indicator-focus); + } } &:has(input:disabled:not(:checked)) { --_card-bg: var( - --form-checkbox-radio-card-primary-disabled-default-background - ); - --_card-text: var( - --form-checkbox-radio-card-primary-disabled-default-text + --form-choice-card-primary-unselected-background-disabled ); + --_card-text: var(--form-choice-card-primary-unselected-text-disabled); --_card-border: var( - --form-checkbox-radio-card-primary-disabled-default-background + --form-choice-card-primary-unselected-border-disabled ); } &:has(input:disabled:checked) { - --_card-bg: var( - --form-checkbox-radio-card-primary-disabled-selected-background - ); - --_card-text: var( - --form-checkbox-radio-card-primary-disabled-selected-text - ); - --_card-border: var( - --form-checkbox-radio-card-primary-disabled-selected-background - ); + --_card-bg: var(--form-choice-card-primary-selected-background-disabled); + --_card-text: var(--form-choice-card-primary-selected-text-disabled); + --_card-border: var(--_card-bg); - input[tedi-checkbox] { - background-color: transparent; - border-color: var( - --form-checkbox-radio-default-border-selected-inverted + input[tedi-checkbox][type="checkbox"] { + --_checkbox-bg: var(--form-choice-inverted-indicator-disabled); + --_checkbox-border: var( + --form-choice-checkbox-selected-border-inverted + ); + --_checkbox-icon: var( + --form-choice-checkbox-selected-indicator-disabled ); } } } &.tedi-checkbox-card--secondary { - --_card-bg: var(--form-checkbox-radio-card-secondary-default-background); - --_card-text: var(--form-checkbox-radio-card-secondary-default-text); - --_card-border: var(--form-checkbox-radio-card-secondary-default-border); + --_card-bg: var(--form-choice-card-secondary-unselected-background-default); + --_card-text: var(--form-choice-card-secondary-unselected-text-default); + --_card-border: var(--form-choice-card-secondary-unselected-border-default); + + &:has(input:hover:not(:disabled, :checked)) { + --_card-bg: var(--form-choice-card-secondary-unselected-background-hover); + --_card-text: var(--form-choice-card-secondary-unselected-text-hover); + --_card-border: var(--form-choice-card-secondary-unselected-border-hover); + } + + &:has(input:active:not(:disabled, :checked)) { + --_card-bg: var( + --form-choice-card-secondary-unselected-background-active + ); + --_card-text: var(--form-choice-card-secondary-unselected-text-active); + --_card-border: var( + --form-choice-card-secondary-unselected-border-active + ); + } + + &:has(input:focus-visible:not(:hover, :active, :disabled, :checked)) { + --_card-bg: var(--form-choice-card-secondary-unselected-background-focus); + --_card-text: var(--form-choice-card-secondary-unselected-text-focus); + --_card-border: var(--form-choice-card-secondary-unselected-border-focus); + } &:has(input:checked) { - --_card-bg: var(--form-checkbox-radio-card-secondary-selected-background); - --_card-text: var(--form-checkbox-radio-card-secondary-selected-text); - --_card-border: var(--form-checkbox-radio-card-secondary-selected-border); + --_card-bg: var(--form-choice-card-secondary-selected-background-default); + --_card-text: var(--form-choice-card-secondary-selected-text-default); + --_card-border: var(--form-choice-card-secondary-selected-border-default); + --_card-inset: inset 0 0 0 #{$selected-border-inset} var(--_card-border); + } + + &:has(input:checked:hover:not(:disabled)) { + --_card-bg: var(--form-choice-card-secondary-selected-background-hover); + --_card-text: var(--form-choice-card-secondary-selected-text-hover); + --_card-border: var(--form-choice-card-secondary-selected-border-hover); + } - box-shadow: inset 0 0 0 var(--tedi-borders-01) var(--_card-border); + &:has(input:checked:active:not(:disabled)) { + --_card-bg: var(--form-choice-card-secondary-selected-background-active); + --_card-text: var(--form-choice-card-secondary-selected-text-active); + --_card-border: var(--form-choice-card-secondary-selected-border-active); } - &:has(input:hover:not(:disabled)) { - --_card-bg: var(--form-checkbox-radio-card-secondary-hover-background); - --_card-text: var(--form-checkbox-radio-card-secondary-hover-text); - --_card-border: var(--form-checkbox-radio-card-secondary-hover-border); + &:has(input:checked:focus-visible:not(:hover, :active, :disabled)) { + --_card-bg: var(--form-choice-card-secondary-selected-background-focus); + --_card-text: var(--form-choice-card-secondary-selected-text-focus); + --_card-border: var(--form-choice-card-secondary-selected-border-focus); } &:has(input:disabled:not(:checked)) { --_card-bg: var( - --form-checkbox-radio-card-secondary-disabled-default-background - ); - --_card-text: var( - --form-checkbox-radio-card-secondary-disabled-default-text + --form-choice-card-secondary-unselected-background-disabled ); + --_card-text: var(--form-choice-card-secondary-unselected-text-disabled); --_card-border: var( - --form-checkbox-radio-card-secondary-disabled-default-border + --form-choice-card-secondary-unselected-border-disabled ); } &:has(input:disabled:checked) { --_card-bg: var( - --form-checkbox-radio-card-secondary-disabled-selected-background - ); - --_card-text: var( - --form-checkbox-radio-card-secondary-disabled-selected-text + --form-choice-card-secondary-selected-background-disabled ); + --_card-text: var(--form-choice-card-secondary-selected-text-disabled); --_card-border: var( - --form-checkbox-radio-card-secondary-disabled-selected-border + --form-choice-card-secondary-selected-border-disabled ); - - box-shadow: inset 0 0 0 var(--tedi-borders-01) var(--_card-border); + --_card-inset: inset 0 0 0 #{$selected-border-inset} var(--_card-border); } } } diff --git a/src/tedi/components/form/checkbox-card/checkbox-card.component.ts b/src/tedi/components/form/checkbox-card/checkbox-card.component.ts index b6ff91173..8da4d8888 100644 --- a/src/tedi/components/form/checkbox-card/checkbox-card.component.ts +++ b/src/tedi/components/form/checkbox-card/checkbox-card.component.ts @@ -29,8 +29,8 @@ export class CheckboxCardComponent { readonly variant = input("primary"); /** - * Whether to show the checkbox indicator. - * When false, the checkbox is visually hidden but remains functional. + * Show the checkbox indicator. + * When false, the checkbox is visually hidden but stays functional. * @default true */ readonly showIndicator = input(true); diff --git a/src/tedi/components/form/checkbox-group/checkbox-group.component.spec.ts b/src/tedi/components/form/checkbox-group/checkbox-group.component.spec.ts index 4b2073d6f..4212354fc 100644 --- a/src/tedi/components/form/checkbox-group/checkbox-group.component.spec.ts +++ b/src/tedi/components/form/checkbox-group/checkbox-group.component.spec.ts @@ -1,5 +1,6 @@ import { Component } from "@angular/core"; import { ComponentFixture, TestBed } from "@angular/core/testing"; +import { By } from "@angular/platform-browser"; import { FormControl, ReactiveFormsModule } from "@angular/forms"; import { CheckboxGroupComponent, @@ -515,3 +516,54 @@ describe("CheckboxGroupComponent — missing child value", () => { warnSpy.mockRestore(); }); }); + +describe("CheckboxGroupComponent — selection checks", () => { + let fixture: ComponentFixture; + let group: CheckboxGroupComponent; + let inputs: HTMLInputElement[]; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [FormControlHostComponent], + }); + + fixture = TestBed.createComponent(FormControlHostComponent); + fixture.detectChanges(); + group = fixture.debugElement.query( + By.directive(CheckboxGroupComponent), + ).componentInstance; + inputs = Array.from( + (fixture.nativeElement as HTMLElement).querySelectorAll( + 'input[type="checkbox"]', + ), + ) as HTMLInputElement[]; + }); + + it("should not emit when a change does not alter the values", () => { + fixture.componentInstance.control.setValue(["urgent"]); + fixture.detectChanges(); + const emitted: (string[] | null)[] = []; + fixture.componentInstance.control.valueChanges.subscribe((v) => + emitted.push(v), + ); + + inputs[0].checked = true; + inputs[0].dispatchEvent(new Event("change", { bubbles: true })); + inputs[1].checked = false; + inputs[1].dispatchEvent(new Event("change", { bubbles: true })); + fixture.detectChanges(); + + expect(emitted).toEqual([]); + expect(fixture.componentInstance.control.value).toEqual(["urgent"]); + expect(fixture.componentInstance.control.dirty).toBe(false); + }); + + it("should report whether a value is selected", () => { + fixture.componentInstance.control.setValue(["urgent"]); + fixture.detectChanges(); + + expect(group.isSelected("urgent")).toBe(true); + expect(group.isSelected("review")).toBe(false); + expect(group.isSelected(undefined)).toBe(false); + }); +}); diff --git a/src/tedi/components/form/checkbox/checkbox.component.scss b/src/tedi/components/form/checkbox/checkbox.component.scss index c3e498f75..cdf1a25af 100644 --- a/src/tedi/components/form/checkbox/checkbox.component.scss +++ b/src/tedi/components/form/checkbox/checkbox.component.scss @@ -1,7 +1,21 @@ @use "@tedi-design-system/core/bootstrap-utility/breakpoints"; +$focus-ring: + 0 0 0 var(--tedi-borders-01) + var(--general-effect-colors-focus-outset-inner-shadow), + 0 0 0 var(--tedi-borders-03) + var(--general-effect-colors-focus-outset-outer-shadow); +$selected-border-inset: calc( + var(--general-border-width-selected) - var(--tedi-borders-01) +); + input[tedi-checkbox][type="checkbox"] { --_checkbox-icon-size: 1.125rem; + --_checkbox-bg: var(--form-choice-checkbox-unselected-default); + --_checkbox-border: var(--form-choice-checkbox-unselected-border-default); + --_checkbox-icon: var(--form-choice-checkbox-selected-indicator-default); + --_checkbox-inset: 0 0 0 0 transparent; + --_checkbox-ring: 0 0 0 0 transparent; position: relative; width: var(--form-checkbox-radio-size-responsive); @@ -12,40 +26,73 @@ input[tedi-checkbox][type="checkbox"] { vertical-align: middle; appearance: none; cursor: pointer; - background-color: var(--form-checkbox-radio-default-background-default); - border: 1px solid var(--form-checkbox-radio-default-border-default); + background-color: var(--_checkbox-bg); + border: var(--tedi-borders-01) solid var(--_checkbox-border); border-radius: var(--form-checkbox-radio-indicator-radius-checkbox); + box-shadow: var(--_checkbox-inset), var(--_checkbox-ring); @include breakpoints.media-breakpoint-up(sm) { --_checkbox-icon-size: 1rem; } - &:not(:disabled):hover { - border-color: var(--form-checkbox-radio-default-border-hover); - box-shadow: 0 0 0 1px var(--form-checkbox-radio-default-border-hover); + // Unselected + &:not(:disabled, :checked, :indeterminate):hover { + --_checkbox-border: var(--form-choice-checkbox-unselected-border-hover); + --_checkbox-inset: inset 0 0 0 #{$selected-border-inset} + var(--_checkbox-border); + } + + &:not(:disabled, :checked, :indeterminate):active { + --_checkbox-border: var(--form-choice-checkbox-unselected-border-active); + --_checkbox-inset: inset 0 0 0 #{$selected-border-inset} + var(--_checkbox-border); + } + + &:focus-visible:not(:disabled) { + --_checkbox-ring: #{$focus-ring}; + + outline: none; } - &:not(:disabled):active { - background-color: var(--form-checkbox-radio-default-background-active); - border-color: var(--form-checkbox-radio-default-border-active); - box-shadow: none; + &:focus-visible:not(:disabled, :checked, :indeterminate) { + --_checkbox-border: var(--form-choice-checkbox-unselected-border-focus); } - &:not(:checked):disabled { + &:disabled:not(:checked, :indeterminate) { + --_checkbox-bg: var(--form-choice-checkbox-unselected-disabled); + --_checkbox-border: var(--form-choice-checkbox-unselected-border-disabled); + cursor: not-allowed; - background-color: var(--form-general-background-disabled); - border-color: var(--form-general-border-disabled); } + // Selected &:checked, &:indeterminate { - background-color: var(--form-checkbox-radio-default-background-selected); - border-color: var(--form-checkbox-radio-default-border-selected); + --_checkbox-bg: var(--form-choice-checkbox-selected-default); + --_checkbox-border: var(--form-choice-checkbox-selected-border-default); + + &:not(:disabled):hover { + --_checkbox-bg: var(--form-choice-checkbox-selected-hover); + --_checkbox-border: var(--form-choice-checkbox-selected-border-hover); + --_checkbox-icon: var(--form-choice-checkbox-selected-indicator-hover); + } + + &:not(:disabled):active { + --_checkbox-bg: var(--form-choice-checkbox-selected-active); + --_checkbox-border: var(--form-choice-checkbox-selected-border-active); + --_checkbox-icon: var(--form-choice-checkbox-selected-indicator-active); + } + + &:focus-visible:not(:disabled, :hover, :active) { + --_checkbox-border: var(--form-choice-checkbox-selected-border-focus); + } &:disabled { + --_checkbox-bg: var(--form-choice-checkbox-selected-disabled); + --_checkbox-border: var(--form-choice-checkbox-selected-border-disabled); + --_checkbox-icon: var(--form-choice-checkbox-selected-indicator-disabled); + cursor: not-allowed; - background-color: var(--form-checkbox-radio-default-background-selected-disabled); - border-color: var(--form-checkbox-radio-default-border-selected-disabled); } &::before { @@ -55,7 +102,7 @@ input[tedi-checkbox][type="checkbox"] { font-family: "Material Symbols Outlined", sans-serif; font-size: var(--_checkbox-icon-size); line-height: 1; - color: var(--form-checkbox-radio-default-check-indicator-default); + color: var(--_checkbox-icon); content: "check"; transform: translate(-50%, -50%); -webkit-font-smoothing: antialiased; @@ -74,20 +121,16 @@ input[tedi-checkbox][type="checkbox"] { } } - &:focus-visible { - outline: var(--tedi-borders-02) solid var(--tedi-primary-500); - outline-offset: var(--tedi-borders-01); - } - - &:not(:checked, :disabled).tedi-checkbox--invalid, - &:not(:checked, :disabled):user-invalid, - &:not(:checked, :disabled).ng-invalid.ng-touched { - background-color: var(--form-checkbox-radio-default-background-error); - border-color: var(--form-general-feedback-error-border); + // Error (selected state keeps its regular colors) + &:not(:checked, :indeterminate, :disabled).tedi-checkbox--invalid, + &:not(:checked, :indeterminate, :disabled):user-invalid, + &:not(:checked, :indeterminate, :disabled).ng-invalid.ng-touched { + --_checkbox-border: var(--form-choice-checkbox-unselected-border-error); - &:hover { - border-color: var(--form-general-feedback-error-border); - box-shadow: 0 0 0 1px var(--form-general-feedback-error-border); + &:hover, + &:active { + --_checkbox-inset: inset 0 0 0 #{$selected-border-inset} + var(--_checkbox-border); } } @@ -107,7 +150,7 @@ label:has(input[tedi-checkbox]:disabled) { cursor: not-allowed; } -label:has(input[tedi-checkbox])+tedi-feedback-text { +label:has(input[tedi-checkbox]) + tedi-feedback-text { padding-left: var(--form-checkbox-radio-size-responsive); margin-left: var(--form-checkbox-radio-inner-spacing); } diff --git a/src/tedi/components/form/checkbox/checkbox.component.ts b/src/tedi/components/form/checkbox/checkbox.component.ts index 81cd0c673..7037067bf 100644 --- a/src/tedi/components/form/checkbox/checkbox.component.ts +++ b/src/tedi/components/form/checkbox/checkbox.component.ts @@ -35,7 +35,7 @@ export class CheckboxComponent implements OnInit, OnDestroy { */ readonly size = input("default"); /** - * Is checkbox invalid? + * Show the checkbox in an invalid state. * @default false */ readonly invalid = input(false); @@ -46,7 +46,7 @@ export class CheckboxComponent implements OnInit, OnDestroy { */ readonly value = input(); /** - * Disables this checkbox. An enclosing disabled `` + * Disable this checkbox. An enclosing disabled `` * forces disabled regardless of this input. * @default false */ diff --git a/src/tedi/components/form/checkbox/checkbox.stories.ts b/src/tedi/components/form/checkbox/checkbox.stories.ts index 499c3064d..f5110a799 100644 --- a/src/tedi/components/form/checkbox/checkbox.stories.ts +++ b/src/tedi/components/form/checkbox/checkbox.stories.ts @@ -26,7 +26,8 @@ type StoryCheckboxComponent = CheckboxComponent & { }; /** - * Figma ↗
+ * Checkbox Figma ↗
+ * Checkbox card Figma ↗
* Zeroheight ↗ */ export default { @@ -72,7 +73,7 @@ export default { }, invalid: { control: "boolean", - description: "Is checkbox invalid?", + description: "Show the checkbox in an invalid state.", table: { category: "Checkbox", type: { @@ -85,7 +86,7 @@ export default { }, disabled: { control: "boolean", - description: "Is checkbox disabled?", + description: "Disable the checkbox.", table: { category: "Checkbox", type: { @@ -96,7 +97,7 @@ export default { indeterminate: { control: "boolean", description: - "Renders an alternate checked state, with a slash, which is neither toggled on or off. Interacting with the checkbox will dismiss the indeterminate state.", + "Show an indeterminate state, marked with a dash, that is neither checked nor unchecked. Interacting with the checkbox clears it.", table: { category: "Checkbox", }, @@ -106,7 +107,7 @@ export default { options: ["primary", "secondary"], description: "Visual variant of the checkbox card.", table: { - category: "CheckboxCard", + category: "Checkbox Card", type: { summary: "CheckboxCardVariant", detail: "primary \nsecondary", @@ -119,9 +120,9 @@ export default { showIndicator: { control: "boolean", description: - "Whether to show the checkbox indicator. When false, the checkbox is visually hidden but remains functional.", + "Show the checkbox indicator. When false, the checkbox is visually hidden but stays functional.", table: { - category: "CheckboxCard", + category: "Checkbox Card", type: { summary: "boolean", }, @@ -134,7 +135,7 @@ export default { control: "text", description: "Label text displayed above the checkbox group.", table: { - category: "CheckboxGroup", + category: "Checkbox Group", type: { summary: "string", }, @@ -145,7 +146,7 @@ export default { options: ["horizontal", "vertical"], description: "Layout direction of the checkboxes.", table: { - category: "CheckboxGroup", + category: "Checkbox Group", type: { summary: "CheckboxGroupDirection", detail: "horizontal \nvertical", @@ -172,7 +173,7 @@ export const Default: StoryObj = template: ` `, }), @@ -186,11 +187,25 @@ export const Size: StoryObj = { render: (args) => ({ props: args, template: ` - -
Default
- -
Large
- + + +

Default

+
+ + + + +
+

Large

+ +

Applied automatically on mobile screen sizes.

+

Otherwise, prefer using default size.

+
+
+
+ + +
`, }), @@ -200,18 +215,18 @@ export const Vertical: StoryObj = { render: (args) => ({ props: args, template: ` - + `, @@ -222,18 +237,18 @@ export const Horizontal: StoryObj = { render: (args) => ({ props: args, template: ` - + `, @@ -273,31 +288,31 @@ export const VerticalTree: StoryObj = { return { props: args, template: ` - + @@ -311,33 +326,23 @@ export const Separate: StoryObj = { props: args, template: ` -
- - -
-
- - -
-