18F/web-design-standards

View on GitHub
packages/usa-accordion/src/styles/_usa-accordion.scss

Summary

Maintainability
Test Coverage
@use "sass:map";
@use "uswds-core" as *;

// Variables
$accordion-context: "Accordion";

$accordion-border: units($theme-accordion-border-width) solid
  color($theme-accordion-border-color);

$accordion-button-background-active-color: next-token(
  $theme-accordion-button-background-color,
  "darker"
);

// Maps for High Contrast Mode

$accordion-icon-map-defaults: (
  color: color("ButtonText"),
  svg-height: 20,
  svg-width: 20,
  height: units(3),
);

$accordion-button-unopen-hc-icon: map-merge(
  $accordion-icon-map-defaults,
  (
    "name": "add",
  )
);

$accordion-button-open-hc-icon: map-merge(
  $accordion-icon-map-defaults,
  (
    "name": "remove",
  )
);

// Accordion Styles
@mixin accordion-list-styles {
  @include unstyled-list;
  color: color("ink");
  margin: 0;
  padding: 0;
  width: 100%;
}

@mixin accordion-hc-icon-styles {
  height: 100%;
  position: absolute;
  right: units(2.5);
  top: 0;
}

// Opened styles
@mixin accordion-button-styles {
  @include button-unstyled;
  @include set-text-and-bg(
    $theme-accordion-button-background-color,
    $context: $accordion-context
  );
  @include set-icon-from-bg(
    $theme-accordion-button-background-color,
    "usa-icons/remove",
    "usa-icons-bg/remove--white"
  );
  background-position: right units(2.5) center;
  background-size: units(3);
  cursor: pointer;
  display: inline-block;
  font-weight: font-weight("bold");
  margin: 0;
  padding: units(2) units(2.5) * 2 + units(2) units(2) units(2.5);
  text-decoration: none;
  width: 100%;

  &:hover {
    @include set-text-and-bg(
      $accordion-button-background-active-color,
      $context: $accordion-context
    );
    @include set-icon-from-bg(
      $accordion-button-background-active-color,
      "usa-icons/remove",
      "usa-icons-bg/remove--white"
    );
    text-decoration: none;
  }

  @media (forced-colors: active) {
    border: $border-high-contrast;
    position: relative;

    &::before {
      @include add-color-icon($accordion-button-open-hc-icon);
      @include accordion-hc-icon-styles();
      content: "";
    }
  }
}

@mixin accordion-button-unopened-styles {
  @include set-icon-from-bg(
    $theme-accordion-button-background-color,
    "usa-icons/add",
    "usa-icons-bg/add--white"
  );
  background-size: units(3);

  &:hover {
    @include set-icon-from-bg(
      $accordion-button-background-active-color,
      "usa-icons/add",
      "usa-icons-bg/add--white"
    );
  }

  @media (forced-colors: active) {
    &::before {
      @include add-color-icon($accordion-button-unopen-hc-icon);
      @include accordion-hc-icon-styles();
    }
  }
}

@mixin accordion-nested-list {
  > ul li ul {
    list-style: disc;
    > li > ul {
      list-style: circle;
      > li > ul {
        list-style: square;
      }
    }
  }
}

.usa-accordion {
  @include accordion-list-styles;
  @include accordion-nested-list;
  @include border-box-sizing;
  @include typeset($theme-accordion-font-family);

  + .usa-accordion,
  + .usa-accordion--bordered {
    margin-top: units(1);
  }
}

.usa-accordion--bordered {
  .usa-accordion__content {
    border-bottom: $accordion-border;
    border-left: $accordion-border;
    border-right: $accordion-border;
    padding-bottom: units(2);
  }

  .usa-accordion__heading {
    margin-bottom: 0;
  }
}

.usa-accordion__heading,
// kludge to override .usa-prose styles
// TODO: work this into a mixin
.usa-prose .usa-accordion__heading {
  @include typeset($theme-accordion-font-family, $theme-body-font-size, 1);
  margin: 0;

  &:not(:first-child) {
    margin-top: units(1);
  }
}

.usa-accordion__content {
  @include set-text-and-bg(
    $theme-accordion-background-color,
    $context: $accordion-context
  );
  margin-top: 0;
  overflow: auto;
  padding: units(2) units(2.5) calc(#{units(2)} - #{units(0.5)}) units(2.5);

  > *:first-child {
    margin-top: 0;
  }

  > *:last-child {
    margin-bottom: 0;
  }
}

.usa-accordion__button {
  @include accordion-button-styles;
}

.usa-accordion__button[aria-expanded="false"] {
  @include accordion-button-unopened-styles;
}