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