From 61ebd08094e184fce07e07fc6d39a01394baebbb Mon Sep 17 00:00:00 2001
From: Lauri Eskola <lauri.eskola@acquia.com>
Date: Tue, 29 Jun 2021 18:44:51 +0300
Subject: [PATCH] Issue #3200370 by mherchel, imalabya, KapilV, Indrajith KB,
 lauriii, alexpott, ressa: Fix Olivero's drop-button style to conform with new
 form styles

---
 .../olivero/css/base/variables.pcss.css       |   1 +
 .../olivero/css/components/dropbutton.css     | 203 +++++++++++++-----
 .../css/components/dropbutton.pcss.css        | 161 ++++++++++----
 core/themes/olivero/olivero.info.yml          |   6 +-
 4 files changed, 273 insertions(+), 98 deletions(-)

diff --git a/core/themes/olivero/css/base/variables.pcss.css b/core/themes/olivero/css/base/variables.pcss.css
index 91f331f01ee7..eca4a06ed819 100644
--- a/core/themes/olivero/css/base/variables.pcss.css
+++ b/core/themes/olivero/css/base/variables.pcss.css
@@ -127,6 +127,7 @@
   --color--gray-45: #afb8be; /* Gray medium 2 */
   --color--gray-50: #9ea0a1; /* Black 4 */
   --color--gray-70: #d7e1e8; /* Gray light */
+  --color--gray-75: #e3e3e5;
   --color--gray-80: #e7edf1; /* Gray light 1 */
   --color--gray-90: #f1f4f7;
   --color--gray-95: #f7f9fa; /* Gray light 2 */
diff --git a/core/themes/olivero/css/components/dropbutton.css b/core/themes/olivero/css/components/dropbutton.css
index dee758e29a48..4a3f4c55c6a7 100644
--- a/core/themes/olivero/css/components/dropbutton.css
+++ b/core/themes/olivero/css/components/dropbutton.css
@@ -7,99 +7,190 @@
 
 /**
  * @file
- * Drop button specific styles.
+ * Dropbutton styles.
  */
 
+.dropbutton-wrapper.open {
+  position: relative;
+  z-index: 100; /* Ensure this appears above all other dropbuttons. */
+  filter: drop-shadow(0 2px 2px #e3e3e5);
+}
+
+[dir="ltr"] .dropbutton-widget {
+  padding-right: 1.6875rem;
+}
+
+[dir="rtl"] .dropbutton-widget {
+  padding-left: 1.6875rem;
+}
+
 .dropbutton-widget {
-  overflow: hidden;
-  border: solid 1px #fff;
-  border-radius: 0.1875rem;
+  position: relative;
+  width: 12.5rem;
+  height: 1.6875rem;
+  border-radius: 0.1875rem
 }
 
-.dropbutton {
-  background-color: #0d77b5;
+@supports ((width: -webkit-max-content) or (width: max-content)) {
+
+.dropbutton-widget {
+    width: -webkit-max-content;
+    width: max-content
+}
+  }
+
+[dir="ltr"] .dropbutton-single .dropbutton-widget {
+  padding-right: 0;
+}
+
+[dir="rtl"] .dropbutton-single .dropbutton-widget {
+  padding-left: 0;
+}
+
+[dir="ltr"] .dropbutton {
+  margin-left: 0;
+}
+
+[dir="rtl"] .dropbutton {
+  margin-right: 0;
+}
+
+[dir="ltr"] .dropbutton {
+  padding-left: 0;
 }
 
-.js .dropbutton-widget .dropbutton {
-  overflow: visible;
+[dir="rtl"] .dropbutton {
+  padding-right: 0;
 }
 
-.dropbutton-action {
+.dropbutton {
+  height: 1.6875rem;
+  margin-top: 0;
+  margin-bottom: 0;
+  list-style: none;
   font-size: 0.875rem;
-  line-height: 1.125rem
 }
 
-[dir="ltr"] .dropbutton-action a {
-    padding-left: 1.125rem;
+[dir="ltr"] .dropbutton-toggle button {
+  right: 0;
+}
+
+[dir="rtl"] .dropbutton-toggle button {
+  left: 0;
+}
+
+.dropbutton-toggle button {
+  position: absolute;
+  top: 0;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  width: 1.6875rem;
+  height: 1.6875rem;
+  padding: 0;
+  cursor: pointer;
+  border-color: transparent;
+  border-radius: 0 0.1875rem 0.1875rem 0; /* LTR */
+  background: #e3e3e5
 }
 
-[dir="rtl"] .dropbutton-action a {
-    padding-right: 1.125rem;
+.dropbutton-toggle button:focus {
+    outline: solid 2px #0d77b5;
+    outline-offset: -2px;
+  }
+
+.dropbutton-toggle button:before {
+    display: block;
+    width: 0.5625rem;
+    height: 0.5625rem;
+    content: "";
+    transform: translateY(-25%) rotate(45deg);
+    border-right: solid 2px #0d77b5;
+    border-bottom: solid 2px #0d77b5;
+  }
+
+[dir="rtl"] .dropbutton-toggle button {
+  border-radius: 0.1875rem 0 0 0.1875rem;
 }
 
-[dir="ltr"] .dropbutton-action a {
-    padding-right: 1.125rem;
+[dir="ltr"] .dropbutton-action:first-child {
+    margin-right: 2px;
 }
 
-[dir="rtl"] .dropbutton-action a {
-    padding-left: 1.125rem;
+[dir="rtl"] .dropbutton-action:first-child {
+    margin-left: 2px;
 }
 
+.dropbutton-action:first-child {
+    border: solid 1px transparent;
+    border-radius: 0.1875rem 0 0 0.1875rem; /* LTR */
+    background: #e3e3e5;
+  }
+
 .dropbutton-action a {
-    padding-top: 0.28125rem;
-    padding-bottom: 0.28125rem;
+    display: flex;
+    align-items: center;
+    margin-bottom: -2px; /* Account for borders. */
+    padding: 0 0.5625rem;
     text-decoration: none;
-    color: #fff
+    color: #313637;
+    font-weight: 600
   }
 
-.dropbutton-action a:hover {
-      background-color: #2494db;
+.dropbutton-action a:focus {
+      border: solid 2px #0d77b5;
+      outline: 0
+
+      /* Negate specific IE rules. */
     }
 
+@supports (outline-offset: -2px) {
+
 .dropbutton-action a:focus {
-      outline: 2px solid #53b0eb;
-      outline-offset: 2px;
-      background-color: #2494db;
+        border: 0;
+        outline: solid 2px #0d77b5;
+        outline-offset: -1px /* Overlap parent container by 1px. */
     }
+      }
 
-.open .dropbutton-action:not(:last-child) {
-  border-bottom: solid 1px #fff;
-}
+.dropbutton-single .dropbutton-action:first-child {
+    border-right: solid 1px transparent; /* LTR */
+    border-radius: 0.1875rem;
+  }
 
-.js .dropbutton-action a:focus {
-  outline: 2px solid #53b0eb;
-}
+.dropbutton-single .dropbutton-action a {
+    justify-content: center;
+  }
 
-[dir="ltr"] .dropbutton-toggle {
-  border-left: 1px solid #fff;
-}
+[dir="rtl"] .dropbutton-action:first-child {
+    border: solid 1px transparent;
+    border-radius: 0 0.1875rem 0.1875rem 0;
+  }
 
-[dir="rtl"] .dropbutton-toggle {
-  border-right: 1px solid #fff;
-}
+[dir="rtl"] .dropbutton-single .dropbutton-action:first-child {
+    border: solid 1px transparent;
+  }
 
-.dropbutton-toggle {
-  background-color: #0d77b5
+.secondary-action {
+  visibility: hidden;
+  width: calc(100% + 1.6875rem);
+  border-right: 1px solid #e3e3e5;
+  border-left: 1px solid #e3e3e5;
+  background: #fff
 }
 
-.dropbutton-toggle:hover {
-    background-color: #2494db;
+.secondary-action:last-child {
+    border-bottom: 1px solid #e3e3e5;
   }
 
-.dropbutton-toggle button:focus {
-    outline: solid 2px #53b0eb;
-    outline-offset: 2px;
-    background-color: #2494db;
+.dropbutton-wrapper.open .dropbutton-toggle button:before {
+    transform: translateY(25%) rotate(225deg);
   }
 
-.dropbutton-arrow {
-  left: 0;
-  right: 0;
-  margin-left: auto;
-  margin-right: auto;
-  border-top-color: #fff;
-}
+.dropbutton-wrapper.open .dropbutton-widget {
+    border-radius: 0.1875rem 0.1875rem 0 0;
+  }
 
-.dropbutton-multiple.open .dropbutton-arrow {
-  border-bottom-color: #fff;
-}
+.dropbutton-wrapper.open .secondary-action {
+    visibility: visible;
+  }
diff --git a/core/themes/olivero/css/components/dropbutton.pcss.css b/core/themes/olivero/css/components/dropbutton.pcss.css
index 32a70560df4d..b217a67d1730 100644
--- a/core/themes/olivero/css/components/dropbutton.pcss.css
+++ b/core/themes/olivero/css/components/dropbutton.pcss.css
@@ -1,76 +1,157 @@
 /**
  * @file
- * Drop button specific styles.
+ * Dropbutton styles.
  */
 
 @import "../base/variables.pcss.css";
 
+:root {
+  --dropbutton--height: var(--sp1-5);
+  --dropbutton--bg-color: var(--color--gray-75);
+  --dropbutton--border-color: var(--color--blue-20);
+}
+
+.dropbutton-wrapper.open {
+  position: relative;
+  z-index: 100; /* Ensure this appears above all other dropbuttons. */
+  filter: drop-shadow(0 2px 2px var(--dropbutton--bg-color));
+}
+
 .dropbutton-widget {
-  overflow: hidden;
-  border: solid 1px var(--color--white);
+  position: relative;
+  width: 200px;
+  height: var(--dropbutton--height);
+  padding-inline-end: var(--dropbutton--height);
   border-radius: var(--border-radius);
+
+  @supports (width: max-content) {
+    width: max-content;
+  }
+}
+
+.dropbutton-single .dropbutton-widget {
+  padding-inline-end: 0;
 }
 
 .dropbutton {
-  background-color: var(--color--blue-20);
+  height: var(--dropbutton--height);
+  margin-block: 0;
+  margin-inline-start: 0;
+  padding-inline-start: 0;
+  list-style: none;
+  font-size: var(--font-size-s);
+}
+
+.dropbutton-toggle button {
+  position: absolute;
+  top: 0;
+  inset-inline-end: 0;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  width: var(--dropbutton--height);
+  height: var(--dropbutton--height);
+  padding: 0;
+  cursor: pointer;
+  border-color: transparent;
+  border-radius: 0 var(--border-radius) var(--border-radius) 0; /* LTR */
+  background: var(--dropbutton--bg-color);
+
+  &:focus {
+    outline: solid 2px var(--dropbutton--border-color);
+    outline-offset: -2px;
+  }
+
+  &:before {
+    display: block;
+    width: var(--sp0-5);
+    height: var(--sp0-5);
+    content: "";
+    transform: translateY(-25%) rotate(45deg);
+    border-right: solid 2px var(--dropbutton--border-color);
+    border-bottom: solid 2px var(--dropbutton--border-color);
+  }
 }
 
-.js .dropbutton-widget .dropbutton {
-  overflow: visible;
+[dir="rtl"] .dropbutton-toggle button {
+  border-radius: var(--border-radius) 0 0 var(--border-radius);
 }
 
 .dropbutton-action {
-  font-size: var(--font-size-s);
-  line-height: var(--line-height-s);
+  &:first-child {
+    margin-inline-end: 2px;
+    border: solid 1px transparent;
+    border-radius: var(--border-radius) 0 0 var(--border-radius); /* LTR */
+    background: var(--dropbutton--bg-color);
+  }
 
   & a {
-    padding-block: var(--sp0-25);
-    padding-inline-start: var(--sp1);
-    padding-inline-end: var(--sp1);
+    display: flex;
+    align-items: center;
+    margin-bottom: -2px; /* Account for borders. */
+    padding: 0 9px;
     text-decoration: none;
-    color: var(--color--white);
-
-    &:hover {
-      background-color: var(--color--blue-50);
-    }
+    color: var(--color--gray-10);
+    font-weight: 600;
 
     &:focus {
-      outline: 2px solid var(--color--blue-70);
-      outline-offset: 2px;
-      background-color: var(--color--blue-50);
+      border: solid 2px var(--dropbutton--border-color);
+      outline: 0;
+
+      /* Negate specific IE rules. */
+      @supports (outline-offset: -2px) {
+        border: 0;
+        outline: solid 2px var(--dropbutton--border-color);
+        outline-offset: -1px; /* Overlap parent container by 1px. */
+      }
     }
   }
 }
 
-.open .dropbutton-action:not(:last-child) {
-  border-block-end: solid 1px var(--color--white);
-}
+.dropbutton-single .dropbutton-action {
+  &:first-child {
+    border-right: solid 1px transparent; /* LTR */
+    border-radius: var(--border-radius);
+  }
 
-.js .dropbutton-action a:focus {
-  outline: 2px solid var(--color--blue-70);
+  & a {
+    justify-content: center;
+  }
 }
 
-.dropbutton-toggle {
-  border-inline-start: 1px solid var(--color--white);
-  background-color: var(--color--blue-20);
-
-  &:hover {
-    background-color: var(--color--blue-50);
+[dir="rtl"] {
+  & .dropbutton-action:first-child {
+    border: solid 1px transparent;
+    border-radius: 0 var(--border-radius) var(--border-radius) 0;
   }
 
-  & button:focus {
-    outline: solid 2px var(--color--blue-70);
-    outline-offset: 2px;
-    background-color: var(--color--blue-50);
+  & .dropbutton-single .dropbutton-action:first-child {
+    border: solid 1px transparent;
   }
 }
 
-.dropbutton-arrow {
-  inset-inline: 0;
-  margin-inline: auto;
-  border-top-color: var(--color--white);
+.secondary-action {
+  visibility: hidden;
+  width: calc(100% + var(--dropbutton--height));
+  border-right: 1px solid var(--dropbutton--bg-color);
+  border-left: 1px solid var(--dropbutton--bg-color);
+  background: var(--color--white);
+
+  &:last-child {
+    border-bottom: 1px solid var(--dropbutton--bg-color);
+  }
 }
 
-.dropbutton-multiple.open .dropbutton-arrow {
-  border-bottom-color: var(--color--white);
+.dropbutton-wrapper.open {
+  & .dropbutton-toggle button:before {
+    transform: translateY(25%) rotate(225deg);
+  }
+
+  & .dropbutton-widget {
+    border-radius: var(--border-radius) var(--border-radius) 0 0;
+  }
+
+  & .secondary-action {
+    visibility: visible;
+  }
 }
diff --git a/core/themes/olivero/olivero.info.yml b/core/themes/olivero/olivero.info.yml
index e77d9546935b..9118a1205836 100644
--- a/core/themes/olivero/olivero.info.yml
+++ b/core/themes/olivero/olivero.info.yml
@@ -41,6 +41,10 @@ libraries-override:
         css/components/ajax-progress.module.css: css/components/ajax-progress.module.css
         css/components/autocomplete-loading.module.css: css/components/autocomplete-loading.module.css
   core/drupal.checkbox: false
+  core/drupal.dropbutton:
+    css:
+      component:
+        misc/dropbutton/dropbutton.css: css/components/dropbutton.css
   core/drupal.vertical-tabs:
     css:
       component:
@@ -58,8 +62,6 @@ libraries-extend:
     - olivero/dialog.off_canvas
   core/drupal.progress:
     - olivero/progress
-  core/drupal.dropbutton:
-    - olivero/dropbutton
   layout_discovery/onecol:
     - olivero/layout_discovery_section
   layout_discovery/twocol_bricks:
-- 
GitLab