From c24d1b7942d0992cbaf5855a45ff02500661498b Mon Sep 17 00:00:00 2001 From: Ly Tempel Date: Fri, 23 Oct 2026 17:06:16 +0300 Subject: [PATCH 1/6] feat(checkbox,radio): apply new variables to Checkbox and Radio #784 Bump @tedi-design-system/core to 6.12.0 and move Checkbox, Radio and their card variants to the new --form-choice-* tokens, matching the Figma states for default, hover, active, focus, disabled and error. - Add `bordered` to RadioCard and RadioCardGroup for bordered primary cards - Indent card descriptions past the icon so they line up with the label text - Rename tokens removed in core 6.12.0 in other components (Button, Toggle, Accordion, Calendar, DatePicker, Pagination, Dropdown, ChoiceGroup, VerticalStepper, TextEditor) --- package-lock.json | 9 +- package.json | 2 +- .../checkbox/checkbox/checkbox.component.scss | 24 +- .../choicegroup/_choicegroup-card-mixins.scss | 43 +- .../form/choicegroup/choicegroup.styles.scss | 14 +- .../form/radio/radio/radio.component.scss | 20 +- .../vertical-stepper-item.component.scss | 4 +- .../text-editor/text-editor.component.scss | 2 +- .../buttons/button/button.component.scss | 24 +- .../accordion-item-header.component.scss | 2 +- .../content/accordion/accordion.stories.ts | 2 +- .../calendar-month-grid.component.scss | 36 +- .../calendar-year-grid.component.scss | 36 +- .../checkbox-card.component.scss | 216 +++- .../checkbox-card/checkbox-card.component.ts | 4 +- .../checkbox-group.component.spec.ts | 52 + .../form/checkbox/checkbox.component.scss | 105 +- .../form/checkbox/checkbox.component.ts | 4 +- .../form/checkbox/checkbox.stories.ts | 900 ++++++++------ .../date-picker/date-picker.component.scss | 34 +- .../radio-card-group.component.ts | 8 + .../form/radio-card/radio-card.component.scss | 308 +++-- .../radio-card/radio-card.component.spec.ts | 47 + .../form/radio-card/radio-card.component.ts | 19 +- .../radio-group/radio-group.component.spec.ts | 58 + .../form/radio/radio.component.scss | 95 +- .../components/form/radio/radio.component.ts | 4 +- .../components/form/radio/radio.stories.ts | 1105 ++++++++++------- .../form/toggle/toggle.component.scss | 72 +- ...ination-option-picker-modal.component.scss | 5 +- .../dropdown-item-value.component.scss | 26 +- 31 files changed, 2033 insertions(+), 1247 deletions(-) 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..188af0090 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,20 @@ } &: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); + --_checkbox-bg: var(--form-choice-checkbox-selected-active); } &:has(input:disabled) { @@ -79,16 +79,12 @@ } &:has(input:disabled:checked) { - --_checkbox-bg: var( - --form-checkbox-radio-default-background-selected-disabled - ); - --_checkbox-border: var( - --form-checkbox-radio-default-border-selected-disabled - ); + --_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); + --_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/checkbox-card.component.scss b/src/tedi/components/form/checkbox-card/checkbox-card.component.scss index df9f34b78..415d30524 100644 --- a/src/tedi/components/form/checkbox-card/checkbox-card.component.scss +++ b/src/tedi/components/form/checkbox-card/checkbox-card.component.scss @@ -1,7 +1,18 @@ +$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] { --_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; @@ -20,8 +31,9 @@ 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); [tedi-text], tedi-icon { @@ -47,6 +59,16 @@ 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. The icon + // keeps its 18px size while the indicator grows on small screens + &: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 +85,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 +107,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..c1bcf1eba 100644 --- a/src/tedi/components/form/checkbox/checkbox.stories.ts +++ b/src/tedi/components/form/checkbox/checkbox.stories.ts @@ -72,7 +72,7 @@ export default { }, invalid: { control: "boolean", - description: "Is checkbox invalid?", + description: "Show the checkbox in an invalid state.", table: { category: "Checkbox", type: { @@ -85,7 +85,7 @@ export default { }, disabled: { control: "boolean", - description: "Is checkbox disabled?", + description: "Disable the checkbox.", table: { category: "Checkbox", type: { @@ -96,7 +96,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 +106,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 +119,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 +134,7 @@ export default { control: "text", description: "Label text displayed above the checkbox group.", table: { - category: "CheckboxGroup", + category: "Checkbox Group", type: { summary: "string", }, @@ -145,7 +145,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 +172,7 @@ export const Default: StoryObj = template: ` `, }), @@ -186,11 +186,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 +214,18 @@ export const Vertical: StoryObj = { render: (args) => ({ props: args, template: ` - + `, @@ -222,18 +236,18 @@ export const Horizontal: StoryObj = { render: (args) => ({ props: args, template: ` - + `, @@ -273,31 +287,31 @@ export const VerticalTree: StoryObj = { return { props: args, template: ` - + @@ -311,33 +325,23 @@ export const Separate: StoryObj = { props: args, template: ` -
- - -
-
- - -
-