[GM3Restyling] Update button component to Material design

Bug: 325441197
Change-Id: I5e2df7b68e0e4ccea84d110709178f48c41fe8fe
Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/5423434
Reviewed-by: Alex Rudenko <[email protected]>
Auto-Submit: Kateryna Prokopenko <[email protected]>
Commit-Queue: Alex Rudenko <[email protected]>
diff --git a/front_end/ui/components/buttons/button.css b/front_end/ui/components/buttons/button.css
index 76157fb..2ff68cc 100644
--- a/front_end/ui/components/buttons/button.css
+++ b/front_end/ui/components/buttons/button.css
@@ -27,84 +27,71 @@
 :host {
   display: inline-flex;
   flex-direction: row;
+  align-items: center;
 }
 
 button {
-  /*
-    --override-button-no-right-border-radius decides
-    whether button has border radius on the right or not.
-
-    It works as a boolean variable:
-    * If it is 1, `--button-has-right-border-radius` becomes a 0 multiplier
-    for the border-radius-top-right and border-radius-bottom-right properties.
-    * If it is not set or 0, it becomes a 1 multiplier
-    for the same properties which means they'll continue to have the given
-    border radius.
-  */
-  --button-has-right-border-radius: calc(1 - var(--override-button-no-right-border-radius, 0));
+  --hover-layer-color: var(--sys-color-state-hover-on-subtle);
+  --active-layer-color: var(--sys-color-state-ripple-neutral-on-subtle);
   --button-border-size: 1px;
-  --button-height: 24px;
-  --button-width: 100%;
+  --button-height: var(--sys-size-11);
+  --button-width: fit-content;
 
   align-items: center;
   background: transparent;
-  border-radius: 12px calc(var(--button-has-right-border-radius) * 12px) calc(var(--button-has-right-border-radius) * 12px) 12px;
+  border-radius: var(--sys-shape-corner-full);
   display: inline-flex;
-  font-family: inherit;
-  font-size: 12px;
-  font-weight: 500;
+  position: relative;
+  font-size: var(--sys-typescale-body4-size);
+  font-weight: var(--ref-typeface-weight-medium);
+  line-height: var(--sys-typescale-body4-line-height);
   height: var(--button-height);
   justify-content: center;
-  line-height: 14px;
-  padding: 0;
+  padding: 0 var(--sys-size-6);
   white-space: nowrap;
   width: var(--button-width);
 
   devtools-icon {
-    width: calc(var(--button-width) - 4px);
-    height: calc(var(--button-height) - 4px);
+    width: var(--icon-size);
+    height: var(--icon-size);
   }
 
   &.small {
     --button-height: 20px;
-
-    border-radius: 2px calc(var(--button-has-right-border-radius) * 2px) calc(var(--button-has-right-border-radius) * 2px) 2px;
   }
 
   &.toolbar,
-  &.round {
-    --button-height: 24px;
-    --button-width: 24px;
+  &.icon,
+  &.only-icon {
+    --button-height: 26px;
+    --button-width: 26px;
+    --icon-size: var(--sys-size-9);
 
     border: none;
     overflow: hidden;
 
     &.small {
-      --button-height: 20px;
-      --button-width: 20px;
+      --button-height: var(--sys-size-11);
+      --button-width: var(--sys-size-11);
+      --icon-size: var(--sys-size-8);
     }
   }
 
-  &.toolbar {
-    border-radius: 2px calc(var(--button-has-right-border-radius) * 2px) calc(var(--button-has-right-border-radius) * 2px) 2px;
-  }
-
-  &.round {
-    border-radius: 100%;
-  }
-
   &.primary {
+    --hover-layer-color: var(--sys-color-state-hover-on-prominent);
+    --active-layer-color: var(--sys-color-state-ripple-primary);
+
     border: var(--button-border-size) solid var(--sys-color-primary);
     background: var(--sys-color-primary);
     color: var(--sys-color-on-primary);
 
     devtools-icon {
-      color: var(--sys-color-cdt-base-container);
+      color: var(--sys-color-on-primary);
     }
   }
 
   &.tonal {
-    border: var(--button-border-size) solid transparent;
+    border: none;
     background: var(--sys-color-tonal-container);
     color: var(--sys-color-on-tonal-container);
 
@@ -113,60 +100,130 @@
     }
   }
 
-  &.secondary {
-    border: var(--button-border-size) solid var(--sys-color-tonal-outline);
-    background: var(--sys-color-cdt-base-container);
-    color: var(--sys-color-primary);
-
-    devtools-icon {
-      color: var(--icon-primary);
-    }
-  }
-
   &.primary-toolbar {
     devtools-icon {
       color: var(--icon-primary);
     }
   }
 
-  &:focus-visible {
-    outline: 2px solid var(--sys-color-state-focus-ring);
-    outline-offset: 2px;
+  &.text {
+    border: none;
+    color: var(--sys-color-primary);
 
-    &.toolbar,
-    &.round {
-      background-color: var(--sys-color-tonal-container);
-      outline: none;
-    }
-  }
-
-  &:disabled {
     devtools-icon {
-      color: var(--icon-disabled);
+      color: var(--icon-primary);
     }
   }
 
   &.text-with-icon {
-    padding: 0 calc(12px - var(--button-border-size)) 0 calc(8px - var(--button-border-size));
+    padding-left: var(--sys-size-4);
 
     devtools-icon {
-      width: 16px;
-      height: 16px;
-      margin-right: 4px;
+      width: var(--sys-size-9);
+      height: var(--sys-size-9);
+      margin-right: var(--sys-size-2);
     }
+  }
+
+  /* This specific nesting is incompatible with what stylelint requires as ordering of the rules. */
+  /* stylelint-disable no-descending-specificity */
+  &.outlined {
+    border: var(--button-border-size) solid var(--sys-color-tonal-outline);
+    background: transparent;
+    color: var(--sys-color-primary);
+
+    devtools-icon {
+      color: var(--icon-primary);
+    }
+
+    &.micro {
+      --button-height: var(--sys-size-7);
+
+      padding: 0 var(--sys-size-5);
+      font-size: var(--sys-typescale-body4-size);
+      font-weight: var(--ref-typeface-weight-medium);
+      line-height: var(--sys-typescale-body4-line-height);
+
+      &:not(.icon):has(devtools-icon) {
+        padding-left: var(--sys-size-3);
+      }
+
+      &:not(.icon) devtools-icon {
+        height: var(--sys-size-6);
+        width: var(--sys-size-6);
+      }
+    }
+  }
+
+  &:disabled {
+    pointer-events: none;
+
+    &.primary {
+      border: var(--button-border-size) solid var(--sys-color-state-disabled-container);
+      background: var(--sys-color-state-disabled-container);
+      color: var(--sys-color-state-disabled);
+    }
+
+    &.tonal {
+      border: var(--button-border-size) solid var(--sys-color-state-disabled-container);
+      background: var(--sys-color-state-disabled-container);
+      color: var(--sys-color-state-disabled);
+    }
+
+    &.outlined {
+      border: var(--button-border-size) solid var(--sys-color-state-disabled-container);
+      color: var(--sys-color-state-disabled);
+    }
+
+    &.toolbar,
+    &.icon {
+      background: transparent;
+      color: var(--sys-color-state-disabled);
+    }
+
+    devtools-icon {
+      color: var(--icon-disabled);
+    }
+  }
+  /* stylelint-enable no-descending-specificity */
+
+  &:not(.icon):not(.toolbar).only-icon {
+    width: 100%;
+    padding: 0;
 
     &.small {
-      padding: 0 calc(9px - var(--button-border-size)) 0 calc(3px - var(--button-border-size));
+      width: var(--button-height);
     }
   }
 
-  &.only-text {
-    padding: 5px 12px;
+  &:focus-visible {
+    outline: 2px solid var(--sys-color-state-focus-ring);
+    outline-offset: 2px;
+    z-index: 999;
+
+    &.toolbar,
+    &.icon {
+      outline-offset: -1px;
+    }
   }
 
-  &:hover {
+  &:has(.spinner) {
+    padding-left: var(--sys-size-4);
+  }
+
+  /* This specific nesting is incompatible with what stylelint requires as ordering of the rules. */
+  /* stylelint-disable no-descending-specificity */
+  &:hover::after {
+    content: "";
+    height: 100%;
+    width: 100%;
+    border-radius: inherit;
+    position: absolute;
+    top: 0;
+    left: 0;
+    background-color: var(--hover-layer-color); /* stylelint-disable-line plugin/use_theme_colors */
+
     &.primary {
-      background: color-mix(in sRGB, var(--sys-color-primary), var(--sys-color-state-hover-on-prominent) 6%);
       border: var(--button-border-size) solid color-mix(in sRGB, var(--sys-color-primary), var(--sys-color-state-hover-on-prominent) 6%);
     }
 
@@ -174,15 +231,6 @@
       background: color-mix(in sRGB, var(--sys-color-tonal-container), var(--sys-color-state-hover-on-subtle));
     }
 
-    &.secondary {
-      background: var(--sys-color-state-hover-on-subtle);
-    }
-
-    &.toolbar,
-    &.round {
-      background-color: var(--sys-color-state-hover-on-subtle);
-    }
-
     &.toobar {
       devtools-icon {
         color: var(--icon-default-hover);
@@ -190,24 +238,23 @@
     }
   }
 
-  &:active,
-  &.active {
+  &:active::before,
+  &.active::before {
+    content: "";
+    height: 100%;
+    width: 100%;
+    border-radius: inherit;
+    position: absolute;
+    top: 0;
+    left: 0;
+    background-color: var(--active-layer-color); /* stylelint-disable-line plugin/use_theme_colors */
+
     &.primary {
-      background: color-mix(in sRGB, var(--sys-color-primary), var(--sys-color-state-ripple-primary) 32%);
       border: var(--button-border-size) solid color-mix(in sRGB, var(--sys-color-primary), var(--sys-color-state-ripple-primary) 32%);
     }
 
     &.tonal {
-      background: color-mix(in sRGB, var(--sys-color-tonal-container), var(--sys-color-state-ripple-primary));
-    }
-
-    &.secondary {
-      background-color: var(--sys-color-surface-variant);
-    }
-
-    &.toolbar,
-    &.round {
-      background-color: var(--sys-color-state-ripple-neutral-on-subtle);
+      background: color-mix(in sRGB, var(--sys-color-tonal-container), var(--sys-color-state-ripple-primary) 50%);
     }
 
     &.toolbar {
@@ -216,32 +263,7 @@
       }
     }
   }
-
-  &:disabled,
-  &:disabled:hover {
-    &.primary {
-      border: var(--button-border-size) solid var(--sys-color-state-disabled-container);
-      background: var(--sys-color-state-disabled-container);
-      color: var(--sys-color-state-disabled);
-    }
-
-    &.tonal {
-      border: var(--button-border-size) solid var(--sys-color-state-disabled-container);
-      background: var(--sys-color-state-disabled-container);
-      color: var(--sys-color-state-disabled);
-    }
-
-    &.secondary {
-      border: var(--button-border-size) solid var(--sys-color-state-disabled-container);
-      color: var(--sys-color-state-disabled);
-    }
-
-    &.toolbar,
-    &.round {
-      background: var(--sys-color-cdt-base-container);
-      color: var(--sys-color-state-disabled);
-    }
-  }
+  /* stylelint-enable no-descending-specificity */
 }
 
 .spinner {
@@ -254,7 +276,7 @@
   border-right-color: transparent;
   margin-right: 4px;
 
-  &.secondary {
+  &.outlined {
     border: 2px solid var(--sys-color-primary);
     border-right-color: transparent;
   }