/*

//infra-sk/themes.scss is a common theme to be used across all Skia
infrastructure applications so that we have a consistent look and feel.

This file consists of several different layers of styling that can be opted
into.


# Layer 1

The first layer is a consistent styling of all buttons, select controls, and
tables, that are applied globally. You get this just by including the
themes.scss file.


# Layer 2

The second layer is applied by adding the `body-sk` class to the <body> element
of a page. This layer adds a large number of semantic CSS variables, whose names
come from Material Design, that are to be used for styling elements. For
example, if you have a panel that should look like a surface then it can be
styled as:

    my-panel {
      background: var(--surface);
      color: var(--on-surface);
    }

These semantic colors are supplied in two sets, one for light mode and another
for dark mode. Dark mode is turned on by adding the `darkmode` class to an
element, which triggers that element and all of its children to move to
darkmode.

The darkmode/lightmode is usually controlled via the `theme-chooser-sk` control
which toggles the `darkmode` class on the body element and persists the user's
choice in local storage.

The `body-sk` class also adds more styling to many common elements such as
buttons, links, and other elements-sk elements.

The Material Design pallette was created from

  https://www.figma.com/community/plugin/1020820278641129628/Material-Theme-Builder-1P

using these two colors as the seeds:

    primary: #005db7
    secondary: #006e1c

And then translate all the CSS variables it provides into the CSS variables of
the existing theme structure. For example: `--md-sys-color-primary-light`
becomes `--primary`.

An alternate source for the algorithms used to generate the color pallette are
here:

    https://github.com/material-foundation/material-color-utilities

# Layer 3

The third layer is applied by adding the `font-sk` class to the body element of
a page. This layer sets consistent font styling for a page, and adds `--font`
and `--mono-font` CSS variables.

To see all of the semantic names and their values working, along with and
example elements in both dark and light mode, run:

    $ ./demopage.sh infra-sk/modules/theme-chooser-sk/

You can use the theme-chooser-sk element on that demo page to toggle between
dark and light modes.

Most applications should use `app-sk` as their base element, so you can also run

   $ ./demopage.sh infra-sk/modules/app-sk/

to see how these styles apply to title bars and sidebars.

*/

@import '../elements-sk/modules/themes/color-palette';
@import '../elements-sk/modules/themes/themes';
@import url('https://fonts.googleapis.com/css?family=Roboto:300,400,500,700,400italic|Roboto+Mono:400,500|Material+Icons');

@import '../elements-sk/modules/styles/buttons';
@import '../elements-sk/modules/styles/select';
@import '../elements-sk/modules/styles/table';

.body-sk {
  &.font-sk,
  & .font-sk {
    /* Typography */
    --font: Roboto, Arial, 'Bitstream Vera Sans', sans-serif;
    --mono-font: Roboto Mono, monospace;

    * {
      font-size: 14px;
      font-family: var(--font);
      box-sizing: border-box;
    }

    h1 {
      font-size: 20px;
      margin: 16px 0;
    }

    h2 {
      font-size: 18px;
      margin: 14px 0;
    }

    h3 {
      font-size: 16px;
      font-weight: 800;
      margin: 12px 0;
    }

    h4 {
      font-size: 14px;
      font-weight: 800;
      margin: 10px 0;
    }

    h5 {
      font-size: 12px;
      font-weight: 600;
      margin: 8px 0;
    }

    code,
    pre {
      font-family: var(--mono-font);
    }
  }

  /* Semantic colors defined by elements-sk. */
  --background: #fdfbff;
  --disabled: #c4c6cf;
  --error: #ba1a1a;
  --error-container: #ffdad6;
  --on-error-container: #410002;
  --on-background: #1a1b1e;
  --on-disabled: #74777f;
  --on-error: #ffffff;
  --on-primary-variant: #001b3d;
  --on-primary: #ffffff;
  --on-secondary: #ffffff;
  --on-surface: #1a1b1e;
  --primary-variant: #a9c7ff;
  --primary: #005db7;
  --secondary: #006e1c;
  --surface: #f4f3f7;
  --surface-1dp: #efedf1;
  --surface-2dp: #e9e7ec;
  --outline: #74777f;
  --transparent-overlay: rgba(0, 0, 0, 0.5);

  /* Additional semantic colors. */
  --primary-highlight: #d6e3ff;
  --secondary-highlight: #94f990;
  --on-hightlight: var(--on-background);

  --failure-alpha: rgba(217, 95, 2, 0.8);
  --failure: rgb(217, 95, 2);
  --on-failure: var(--on-background);
  --on-success: var(--on-background);
  --on-warning: var(--on-background);
  --success-alpha: rgba(102, 166, 30, 0.3);
  --success: rgb(102, 166, 30);
  --warning-alpha: rgb(255, 171, 64, 0.8);
  --warning: rgb(255, 167, 38);
  --unexpected: rgb(117, 112, 179);
  --unexpected-alpha: rgba(117, 112, 179, 1);

  --positive: #4caf50;
  --negative: #f44336;
  --untriaged: #8d6e63;

  &.darkmode,
  & .darkmode {
    /* Semantic colors defined by elements-sk. */
    --background: #000000;
    --disabled: #44474e;
    --error: #ffb4ab;
    --on-error: #690005;
    --error-container: #93000a;
    --on-error-container: #ffdad6;
    --on-background: #e3e2e6;
    --on-disabled: #c4c6cf;
    --on-primary-variant: #00468c;
    --on-primary: #003063;
    --on-secondary: #00390a;
    --on-surface: #c7c6ca;
    --primary-variant: #d6e3ff;
    --primary: #a9c7ff; // #98b3f500
    --secondary: #78dc77;
    --surface: #1a1b1e;
    --surface-1dp: #1e2023;
    --surface-2dp: #292a2d;
    --outline: #8e9099;
    --transparent-overlay: rgba(255, 255, 255, 0.5);

    /* Additional semantic colors. */
    --primary-highlight: #00468c;
    --secondary-highlight: #005313;
    --on-hightlight: #d6e3ff;
    --on-secondary-highlight: #94f990;

    --on-failure: var(--on-surface);
    --on-success: var(--on-surface);
    --on-warning: var(--on-surface);
  }

  a:active,
  a:visited,
  a:link {
    color: var(--primary);
  }

  a:hover {
    /* Distinguish hovering over links. */
    color: var(--primary-variant);
  }

  .input-like,
  input {
    border: solid 1px var(--on-surface);
    color: solid 1px var(--on-surface);
    background: solid 1px var(--surface);
    display: inline-block;
  }

  .button-like,
  button {
    align-items: center;
    background: transparent;
    border-radius: 4px;
    border: solid 1px var(--outline);
    box-shadow: none;
    color: var(--primary);
    display: inline-flex;
    fill: var(--primary);
    font-size: 14px;
    height: 24px;
    justify-content: center;
    margin: 8px 2px;
    min-width: auto;
    padding: 0 12px;
    text-align: center;
    text-transform: none;

    svg {
      width: 20px;
      height: 20px;
    }
  }

  .button-like.large,
  button.large {
    height: 36px;
    padding: 0 18px;

    svg {
      width: 24px;
      height: 24px;
    }
  }

  .button-like:hover,
  button.hover,
  button:hover,
  .button-like:focus,
  button.focus,
  button:focus {
    opacity: 0.85;
    outline: none;
    background-color: var(--surface-1dp);
  }

  .button-like:disabled,
  button:disabled {
    opacity: 0.85;
    background: var(--on-disabled);
    color: var(--disabled);
    fill: var(--disabled);
  }

  .button-like-action,
  .button-like.action,
  button.action {
    color: var(--on-primary);
    fill: var(--on-primary);
    border: none;
    background-color: var(--primary);
  }

  .button-like.action:hover,
  button.action.hover,
  button.action:hover {
    @extend .button-like-action;
    opacity: 0.85;
  }

  .button-like.action:disabled,
  button.action.disabled,
  button.action:disabled {
    @extend .button-like-action;
    opacity: 0.85;
    background: var(--on-disabled);
    color: var(--disabled);
    fill: var(--disabled);
  }

  .button-like-fab,
  .button-like.fab,
  button.fab {
    @extend .button-like;
    background-color: var(--primary-highlight);
    border-radius: 24px;
    border: none;
    color: var(--on-hightlight);
    fill: var(--on-hightlight);
    font-size: 22px;
    height: 48px;
    min-width: 48px;
    padding: 10px;
    width: auto;
  }

  .button-like.fab:hover,
  button.fab:hover {
    @extend .button-like-fab;
    opacity: 0.85;
  }

  .button-like.fab:disabled,
  button.fab:disabled {
    @extend .button-like-fab;
    opacity: 0.85;
    background: var(--on-disabled);
    color: var(--disabled);
    fill: var(--disabled);
  }

  multi-select-sk:focus,
  select-sk:focus {
    outline: dashed 1px var(--on-surface);
    outline-offset: -4px;
  }

  multi-select-sk {
    border-radius: 4px;
    border: solid 1px var(--outline);
    background-color: var(--surface);
    color: var(--on-surface);
  }

  multi-select-sk > * {
    background-color: var(--surface);
    border: solid 1px var(--surface);
  }

  multi-select-sk > [selected] {
    background: var(--surface-2dp);
  }

  multi-select-sk > :hover {
    border: var(--surface-2dp) solid 1px;
  }

  select,
  select-sk {
    border-radius: 4px;
    border-color: var(--outline);
  }

  select-sk,
  select-sk > * {
    background-color: var(--surface);
    color: var(--on-surface);
  }

  select-sk > [selected] {
    background: var(--surface-2dp);
  }

  select-sk > * {
    border: var(--surface) solid 1px;
  }

  select-sk > :hover {
    border: var(--surface-2dp) solid 1px;
  }

  select-sk > :focus {
    background-color: var(--surface-2dp);
    transition: background-color 0.1s cubic-bezier(0.4, 0, 0.2, 1);
  }

  select-sk > [selected] {
    background-color: var(--surface-2dp);
  }

  error-toast-sk toast-sk {
    border-radius: 4px;
    background: var(--error-container);
    color: var(--on-error-container);
    fill: var(--on-error-container);
    padding: 8px;

    button {
      background: var(--error-container);
      color: var(--on-error-container);
      fill: var(--on-error-container);
    }
  }

  toast-sk {
    border-radius: 4px;
    color: var(--on-hightlight);
    fill: var(--on-hightlight);
    border: none;
    background-color: var(--primary-highlight);
  }

  error-toast-sk button {
    margin: 0 0 0 8px;
    padding: 4px;
  }

  tabs-sk {
    display: inline-flex;

    > button,
    > .button-like {
      border: none;
      border-bottom: solid 4px transparent;
      box-shadow: none;
      border-radius: 0;
      opacity: 0.85;
      margin-bottom: 0px;
      fill: var(--on-background);
      color: var(--on-background);
    }
    > button.selected,
    > .button-like.selected {
      border-bottom: solid 4px var(--primary);
      fill: var(--primary);
      color: var(--primary);
    }
  }

  tabs-panel-sk {
    margin-top: 0;
    border-top: solid 1px var(--on-background);
  }

  /*
  This styling makes the `summary` element in a `details` element look like a
  button. If `button` styles are updated then this styling should also be
  updated to match.
  */
  details {
    summary {
      @extend .button-like;
      cursor: pointer;
      list-style: none;
      margin: 8px 4px 8px 0;
    }

    summary::-webkit-details-marker {
      display: none;
    }

    summary:active {
      box-shadow: none;
      transition: box-shadow 0.2s ease-in;
    }
  }

  details[open] {
    border: solid 1px var(--on-surface);
    padding: 0 8px 16px 8px;
    background: var(--surface);
    margin: 8px 8px 8px 0;

    summary {
      margin-top: 8px;
      margin-bottom: 8px;
    }
  }

  details.expando {
    display: block;
    border: none;
    margin: 0 8px;
    padding: 8px;
    background-color: var(--surface-1dp);
    border-radius: 8px;

    summary {
      align-items: center;
      border: none;
      display: flex;
      font-weight: 500;
      justify-content: space-between;
      margin: 8px 0;
      padding: 0;
      border-radius: 0;

      expand-more-icon-sk {
        display: inline-block;
      }

      expand-less-icon-sk {
        display: none;
      }
    }
  }

  details.expando[open] {
    summary {
      expand-more-icon-sk {
        display: none;
      }

      expand-less-icon-sk {
        display: inline-block;
      }
    }
  }

  /*
     The following styles are for scrollbars. There are some non-standard
     looking styles because it is 2020 and there's still no standard way to
     style scrollbars on a web page.

     https://caniuse.com/#feat=css-scrollbar

     There is currently an editor's draft for styling scrollbars:
     https://drafts.csswg.org/css-scrollbars-1/, but it is only supported by
     FireFox. So set that first.
  */

  * {
    scrollbar-color: var(--surface-1dp) var(--background);
  }

  /* Turn on a 13x13 scrollbar */
  ::-webkit-scrollbar {
    width: 13px;
    height: 13px;
  }

  /* Turn off single button up on top and down on bottom */
  ::-webkit-scrollbar-button:start:decrement,
  ::-webkit-scrollbar-button:end:increment,
  ::-webkit-scrollbar-button:vertical:start:increment,
  ::-webkit-scrollbar-button:vertical:end:decrement {
    display: none;
  }

  /* Track below and above */
  ::-webkit-scrollbar-track-piece {
    background-color: var(--background);
    border: solid 1px var(--surface-2dp);
  }

  /* The thumb itself */
  ::-webkit-scrollbar-thumb {
    border: solid 1px var(--on-surface);
    background: var(--surface-1dp);
    border-radius: 4px;
    background: var(--primary);
    color: var(--on-primary);
  }

  /* Handle on hover */
  ::-webkit-scrollbar-thumb:hover {
    background: var(--secondary);
  }

  td {
    font-size: 100%;
  }

  th {
    font-size: 100%;
  }
}
