From 8876ff7fc32cfbfc1d03b95d8458ee1655447201 Mon Sep 17 00:00:00 2001 From: Alexis POYEN <apoyen@grandlyon.com> Date: Fri, 31 Jan 2025 15:18:53 +0100 Subject: [PATCH] UI: add rich radio button component --- .../components/radio-button-checkbox.scss | 92 +++++++++++++++---- ds-ml-css/ds-ml-color-var.scss | 3 +- ds-ml-css/ds-ml-var.scss | 1 + 3 files changed, 78 insertions(+), 18 deletions(-) diff --git a/ds-ml-css/components/radio-button-checkbox.scss b/ds-ml-css/components/radio-button-checkbox.scss index dcf51cd..8f524bd 100644 --- a/ds-ml-css/components/radio-button-checkbox.scss +++ b/ds-ml-css/components/radio-button-checkbox.scss @@ -5,7 +5,8 @@ /* radio-button & checkbox container */ .radio-button-group, -.checkbox-group { +.checkbox-group, +.rich-radio-button-group { border: none; /* additionnal description for radio-button*/ @@ -23,7 +24,9 @@ .radio-button-list, .radio-button-list-horizontal, .checkbox-list, - .checkbox-list-horizontal { + .checkbox-list-horizontal, + .rich-radio-button-list, + .rich-radio-button-list-horizontal { margin-top: var(--ml-xlarge-px); padding-left: var(--ml-small-px); } @@ -32,7 +35,9 @@ .radio-button-list, .radio-button-list-horizontal, .checkbox-list, - .checkbox-list-horizontal { + .checkbox-list-horizontal, + .rich-radio-button-list, + .rich-radio-button-list-horizontal { border-left: 2px var(--ml-text-error) solid !important; } legend { @@ -48,7 +53,9 @@ .radio-button-list, .radio-button-list-horizontal, .checkbox-list, - .checkbox-list-horizontal { + .checkbox-list-horizontal, + .rich-radio-button-list, + .rich-radio-button-list-horizontal { border-left: 2px var(--ml-text-success) solid !important; } legend { @@ -62,19 +69,23 @@ } .radio-button-list-horizontal, -.checkbox-list-horizontal { - width: 20%; - display: flex; - justify-content: space-between; +.checkbox-list-horizontal, +.rich-radio-button-list-horizontal { + grid-template-columns: repeat(3, auto); + display: grid; + grid-gap: var(--ml-medium-px); } /* radio button CSS rules */ .radio-button, -.checkbox { +.checkbox, +.rich-radio-button { display: block; position: relative; - padding-left: calc(var(--ml-radio-button-size) + 12px); + padding-left: calc(var(--ml-radio-button-size) + 32px); padding-top: var(--ml-small-px); + padding-bottom: var(--ml-small-px); + padding-right: var(--ml-small-px); margin-bottom: var(--ml-xxlarge-px); cursor: pointer; font-size: var(--ml-medium-font-size); @@ -109,7 +120,7 @@ .checkbox-wrapper { position: absolute; top: 0; - left: 0; + left: 20px; height: var(--ml-radio-button-size); width: var(--ml-radio-button-size); padding: 3px; @@ -128,7 +139,7 @@ /* Create the indicator (the dot/circle - hidden when not checked) */ &:after { - content: ''; + content: ""; position: absolute; display: none; top: calc(var(--ml-radio-button-size) / 4); @@ -146,7 +157,7 @@ /* Create the checkmark/indicator (hidden when not checked) */ &:after { - content: '\2713'; + content: "\2713"; top: 0; left: 0; width: var(--ml-radio-button-size); @@ -160,7 +171,7 @@ } &.radio-button-small { - padding-left: calc(var(--ml-small-radio-button-size) + 12px); + padding-left: calc(var(--ml-small-radio-button-size) + 32px); .radio-wrapper { height: var(--ml-small-radio-button-size); @@ -180,7 +191,7 @@ } &.checkbox-small { - padding-left: calc(var(--ml-small-radio-button-size) + 12px); + padding-left: calc(var(--ml-small-radio-button-size) + 32px); .checkbox-wrapper { height: var(--ml-small-radio-button-size); @@ -200,15 +211,42 @@ } } +.rich-radio-button { + display: flex; + align-items: center; + border: var(--ml-border-default); + max-width: 15vw; + + p { + flex: auto; + } + img { + max-height: 80px; + max-width: 80px; + } + + .radio-wrapper { + top: 35%; + } + + &:hover { + background-color: var(--ml-m200); + } +} + /* Additional text */ .radio-add-text { position: absolute; top: var(--ml-radio-button-size); - left: calc(var(--ml-radio-button-size) + 12px); + left: calc(var(--ml-radio-button-size) + 32px); color: var(--ml-secondary); font-size: 12px; } +.rich-radio-button .radio-add-text { + top: calc(var(--ml-radio-button-size) + 32px); +} + /* Focus */ .radio-button:has(input:focus-visible):not(input:active) .radio-wrapper { outline-style: solid; @@ -217,6 +255,13 @@ border-radius: 50%; } +.rich-radio-button:has(input:focus-visible):not(input:active) .radio-wrapper { + outline-style: solid; + outline-color: var(--ml-focus-color); + outline-width: 2px; + border-radius: 50%; +} + /* Disabled */ .radio-button:has(input:disabled) { color: var(--ml-disabled); @@ -231,7 +276,6 @@ background: var(--ml-disabled); } -/* Disabled */ .checkbox:has(input:disabled) { color: var(--ml-disabled); cursor: auto; @@ -244,3 +288,17 @@ .checkbox input:disabled ~ .checkbox-wrapper .checkmark:after { background: var(--ml-disabled); } + +.rich-radio-button:has(input:disabled) { + border: var(--ml-border-light); + color: var(--ml-disabled); + cursor: auto; +} + +.rich-radio-button input:disabled ~ .radio-wrapper .radiomark { + border-color: var(--ml-disabled); +} + +.rich-radio-button input:disabled ~ .radio-wrapper .radiomark:after { + background: var(--ml-disabled); +} diff --git a/ds-ml-css/ds-ml-color-var.scss b/ds-ml-css/ds-ml-color-var.scss index b42b7ff..c6b9a59 100644 --- a/ds-ml-css/ds-ml-color-var.scss +++ b/ds-ml-css/ds-ml-color-var.scss @@ -105,7 +105,8 @@ --border-warning: var(--ml-o500); --border-error: var(--ml-r500); /* BORDER FIELDS */ - --border-default-color: var(--ml-n200); + --border-light-color: var(--ml-n200); + --border-default-color: var(--ml-n300); --border-active-color: var(--ml-n950); /* BORDER CHECKBOX */ --border-checkbox: var(--ml-m900); diff --git a/ds-ml-css/ds-ml-var.scss b/ds-ml-css/ds-ml-var.scss index 339fc75..e7c874e 100644 --- a/ds-ml-css/ds-ml-var.scss +++ b/ds-ml-css/ds-ml-var.scss @@ -18,6 +18,7 @@ --ml-large-flex-gap: var(--ml-large-px); /* BORDER */ + --ml-border-light: 1px solid var(--border-light-color); --ml-border-default: 1px solid var(--border-default-color); --ml-border-active: 1px solid var(--border-active-color); -- GitLab