All Downloads are FREE. Search and download functionalities are using the official Maven repository.

package.components.Card.card.scss Maven / Gradle / Ivy

The newest version!
@use '../../sass-utilities' as *;

@include pf-root($card) {
  --#{$card}--BackgroundColor: var(--pf-t--global--background--color--primary--default);
  --#{$card}--BorderColor: var(--pf-t--global--border--color--default);
  --#{$card}--BorderStyle: solid;
  --#{$card}--BorderWidth: var(--pf-t--global--border--width--box--default);
  --#{$card}--BorderRadius: var(--pf-t--global--border--radius--medium);
  --#{$card}--first-child--PaddingBlockStart: var(--pf-t--global--spacer--lg);
  --#{$card}--child--PaddingInlineEnd: var(--pf-t--global--spacer--lg);
  --#{$card}--child--PaddingBlockEnd: var(--pf-t--global--spacer--lg);
  --#{$card}--child--PaddingInlineStart: var(--pf-t--global--spacer--lg);
  --#{$card}--c-divider--child--PaddingBlockStart: var(--pf-t--global--spacer--lg);
  --#{$card}__title--not--last-child--PaddingBlockEnd: var(--pf-t--global--spacer--md);
  --#{$card}__title-text--Color: var(--pf-t--global--text--color--regular);
  --#{$card}__title-text--FontFamily: var(--pf-t--global--font--family--heading);
  --#{$card}__title-text--FontSize: var(--pf-t--global--font--size--heading--xs);
  --#{$card}__title-text--FontWeight: var(--pf-t--global--font--weight--heading--default);
  --#{$card}__title-text--LineHeight: var(--pf-t--global--font--line-height--heading);
  --#{$card}--c-button--disabled--Color: var(--pf-t--global--text--color--on-disabled);
  --#{$card}__body--FontSize: var(--pf-t--global--font--size--body--default);
  --#{$card}__footer--FontSize: var(--pf-t--global--font--size--body--default);
  --#{$card}__footer--Color: var(--pf-t--global--text--color--subtle);
  --#{$card}__actions--PaddingInlineStart: var(--pf-t--global--spacer--md);
  --#{$card}__actions--Gap: var(--pf-t--global--spacer--gap--action-to-action--default);
  --#{$card}__actions--MarginBlockStart: calc(var(--pf-t--global--spacer--control--vertical--default) * -1);
  --#{$card}__actions--MarginBlockEnd: calc(var(--pf-t--global--spacer--control--vertical--default) * -1);

  // Expandable
  --#{$card}__header-toggle--MarginBlockStart: calc(var(--pf-t--global--spacer--control--vertical--default) * -1);
  --#{$card}__header-toggle--MarginInlineEnd: var(--pf-t--global--spacer--gap--text-to-element--default);
  --#{$card}__header-toggle--MarginBlockEnd: calc(var(--pf-t--global--spacer--control--vertical--default) * -1);
  --#{$card}__header-toggle--MarginInlineStart: calc(var(--pf-t--global--spacer--action--horizontal--plain--default) * -1);
  --#{$card}__header-toggle-icon--TransitionTimingFunction: var(--pf-t--global--motion--timing-function--default);
  --#{$card}__header-toggle-icon--TransitionDuration: var(--pf-t--global--motion--duration--icon--long);
  --#{$card}--m-expanded__header-toggle-icon--Rotate: 90deg;

  // Selectable/Clickable
  --#{$card}--m-selectable--BorderWidth: var(--#{$card}--BorderWidth);

  // Clickable clicked
  --#{$card}--m-clickable--m-current--BorderColor: var(--pf-t--global--border--color--clicked);
  --#{$card}--m-clickable--m-current--BorderWidth: var(--pf-t--global--border--width--box--clicked);

  // Selected state (checked) of selectable card
  --#{$card}--m-selectable--m-selected--BorderColor: var(--pf-t--global--border--color--clicked);
  --#{$card}--m-selectable--m-selected--BorderWidth: var(--pf-t--global--border--width--box--clicked);

  // Hover on selectable card
  --#{$card}--m-selectable--hover--BorderColor: var(--pf-t--global--border--color--hover);

  // Focus on selectable card (label)
  --#{$card}--m-selectable--focus--BorderColor: var(--pf-t--global--border--color--hover);
  --#{$card}--m-selectable--focus--BorderWidth: var(--pf-t--global--border--width--box--hover);

  // Focus on a selected card (label)
  --#{$card}--m-selectable--m-selected--focus--BorderColor: var(--pf-t--global--border--color--clicked);
  --#{$card}--m-selectable--m-selected--focus--BorderWidth: var(--pf-t--global--border--width--box--clicked);

  // Disabled state
  --#{$card}--m-selectable--m-disabled__title-text--Color: var(--pf-t--global--text--color--on-disabled);
  --#{$card}--m-selectable--m-disabled__body--Color: var(--pf-t--global--text--color--on-disabled);
  --#{$card}--m-selectable--m-disabled__footer--Color: var(--pf-t--global--text--color--on-disabled);
  --#{$card}--m-selectable--m-disabled--BackgroundColor: var(--pf-t--global--background--color--disabled--default);
  --#{$card}--m-selectable--m-disabled--BorderColor: transparent;

  // Selectable AND Clickable
  // Clicked (pf-m-current) selectable AND clickable card
  --#{$card}--m-selectable--m-clickable--m-current--BorderColor: var(--pf-t--global--border--color--clicked);
  --#{$card}--m-selectable--m-clickable--m-current--BorderWidth: var(--pf-t--global--border--width--box--clicked);

  // Compact
  --#{$card}--m-compact__title-text--FontSize: var(--pf-t--global--font--size--heading--xs);
  --#{$card}--m-compact__body--FontSize: var(--pf-t--global--font--size--body--default);
  --#{$card}--m-compact__footer--FontSize: var(--pf-t--global--font--size--body--sm);
  --#{$card}--m-compact--first-child--PaddingBlockStart: var(--pf-t--global--spacer--md);
  --#{$card}--m-compact--child--PaddingInlineEnd: var(--pf-t--global--spacer--md);
  --#{$card}--m-compact--child--PaddingBlockEnd: var(--pf-t--global--spacer--md);
  --#{$card}--m-compact--child--PaddingInlineStart: var(--pf-t--global--spacer--md);
  --#{$card}--m-compact--c-divider--child--PaddingBlockStart: var(--pf-t--global--spacer--md);
  --#{$card}--m-compact__title--not--last-child--PaddingBlockEnd: var(--pf-t--global--spacer--sm);

  // Display large
  --#{$card}--m-display-lg__title-text--FontSize: var(--pf-t--global--font--size--heading--md);
  --#{$card}--m-display-lg__body--FontSize: var(--pf-t--global--font--size--body--lg);
  --#{$card}--m-display-lg__footer--FontSize: var(--pf-t--global--font--size--body--default);
  --#{$card}--m-display-lg--first-child--PaddingBlockStart: var(--pf-t--global--spacer--xl);
  --#{$card}--m-display-lg--child--PaddingInlineEnd: var(--pf-t--global--spacer--xl);
  --#{$card}--m-display-lg--child--PaddingBlockEnd: var(--pf-t--global--spacer--xl);
  --#{$card}--m-display-lg--child--PaddingInlineStart: var(--pf-t--global--spacer--xl);
  --#{$card}--m-display-lg--c-divider--child--PaddingBlockStart: var(--pf-t--global--spacer--xl);
  --#{$card}--m-display-lg__title--not--last-child--PaddingBlockEnd: var(--pf-t--global--spacer--lg);

  // Secondary
  --#{$card}--m-secondary--BackgroundColor: var(--pf-t--global--background--color--secondary--default);
  --#{$card}--m-secondary--BorderColor: transparent;

  // Full height
  --#{$card}--m-full-height--Height: 100%;

  // Plain - no border or background color
  --#{$card}--m-plain--BorderColor: transparent;
  --#{$card}--m-plain--BackgroundColor: transparent;

  // Toggle right
  --#{$card}__header--m-toggle-right--toggle--MarginInlineEnd: calc(var(--pf-t--global--spacer--action--horizontal--plain--default) * -1);
  --#{$card}__header--m-toggle-right--toggle--MarginInlineStart: var(--pf-t--global--spacer--gap--text-to-element--default);
}

.#{$card} {
  position: relative;
  display: flex;
  flex-direction: column;
  overflow: auto;
  background-color: var(--#{$card}--BackgroundColor);
  border: 0;
  border-radius: var(--#{$card}--BorderRadius);

  &::before {
    position: absolute;
    inset: 0;
    pointer-events: none;
    content: "";
    border: var(--#{$card}--BorderColor) var(--#{$card}--BorderStyle) var(--#{$card}--BorderWidth);
    border-radius: inherit;
  }

  // SELECTABLE CARDS
  &.pf-m-selectable {
    // disables the gap since these have an empty label
    .#{$card}__selectable-actions :is(.#{$check}, .#{$radio}) {
      gap: 0;
    }
  }

  // SELECTABLE or CLICKABLE CARDS
  &.pf-m-selectable,
  &.pf-m-clickable {
    isolation: isolate;

    &::before {
      border: none; // border will come from the input's ::before instead of the card so remove this so there's isn't a double border
    }
  }

  // CLICKABLE is clicked
  &.pf-m-current {
    --#{$card}--BorderColor: var(--#{$card}--m-clickable--m-current--BorderColor);
    --#{$card}--BorderWidth: var(--#{$card}--m-clickable--m-current--BorderWidth);
    --#{$card}--m-selectable--hover--BorderColor: var(--#{$card}--m-clickable--m-current--BorderColor);
    --#{$card}--m-selectable--focus--BorderColor: var(--#{$card}--m-clickable--m-current--BorderColor);
  }

  // stylelint-disable selector-max-class
  // Cards that are BOTH SELECTABLE AND CLICKABLE
  &.pf-m-selectable.pf-m-clickable {
    .#{$card}__selectable-actions :is(.#{$check}__label, .#{$radio}__label) {
      position: unset;

      &::before {
        position: absolute;
        inset: 0;
        cursor: pointer;
      }
    }

    // When SELECTABLE and CLICKABLE card is focused, don't show change of background or border on the card
    .#{$card}__selectable-actions :is(.#{$check}__input, .#{$radio}__input):where(:focus-visible) ~ :is(.#{$check}__label, .#{$radio}__label) {
      --#{$card}--BackgroundColor: revert;
      --#{$card}--BorderColor: revert;
    }

    // SELECTABLE and CLICKABLE card is selected (Check box checked or marked .pf-m-selected)
    .#{$card}__selectable-actions :is(.#{$check}__input, .#{$radio}__input):where(:checked) ~ :is(.#{$check}__label, .#{$radio}__label),
    &.pf-m-selected {
      --#{$card}--BorderColor: revert;
      --#{$card}--m-selectable--BorderWidth: revert;
    }

    // SELECTABLE and CLICKABLE card is clicked
    &.pf-m-current {
      --#{$card}--BorderColor: var(--#{$card}--m-selectable--m-clickable--m-current--BorderColor);
      --#{$card}--BorderWidth: var(--#{$card}--m-selectable--m-clickable--m-current--BorderWidth);
    }

    // SELECTABLE and CLICKABLE but DISABLED card
    .#{$card}__selectable-actions :is(.#{$check}__input, .#{$radio}__input):where(:disabled) ~ :is(.#{$check}__label, .#{$radio}__label),
    &.pf-m-disabled {
      --#{$card}--BackgroundColor: var(--#{$card}--m-selectable--m-disabled--BackgroundColor);
    }
  }
  // stylelint-enable selector-max-class

  &.pf-m-compact {
    --#{$card}__title-text--FontSize: var(--#{$card}--m-compact__title-text--FontSize);
    --#{$card}__body--FontSize: var(--#{$card}--m-compact__body--FontSize);
    --#{$card}__footer--FontSize: var(--#{$card}--m-compact__footer--FontSize);
    --#{$card}--first-child--PaddingBlockStart: var(--#{$card}--m-compact--first-child--PaddingBlockStart);
    --#{$card}--child--PaddingInlineEnd: var(--#{$card}--m-compact--child--PaddingInlineEnd);
    --#{$card}--child--PaddingBlockEnd: var(--#{$card}--m-compact--child--PaddingBlockEnd);
    --#{$card}--child--PaddingInlineStart: var(--#{$card}--m-compact--child--PaddingInlineStart);
    --#{$card}--c-divider--child--PaddingBlockStart: var(--#{$card}--m-compact--c-divider--child--PaddingBlockStart);
    --#{$card}__title--not--last-child--PaddingBlockEnd: var(--#{$card}--m-compact__title--not--last-child--PaddingBlockEnd);
  }

  &.pf-m-display-lg {
    --#{$card}__title-text--FontSize: var(--#{$card}--m-display-lg__title-text--FontSize);
    --#{$card}__body--FontSize: var(--#{$card}--m-display-lg__body--FontSize);
    --#{$card}__footer--FontSize: var(--#{$card}--m-display-lg__footer--FontSize);
    --#{$card}--first-child--PaddingBlockStart: var(--#{$card}--m-display-lg--first-child--PaddingBlockStart);
    --#{$card}--child--PaddingInlineEnd: var(--#{$card}--m-display-lg--child--PaddingInlineEnd);
    --#{$card}--child--PaddingBlockEnd: var(--#{$card}--m-display-lg--child--PaddingBlockEnd);
    --#{$card}--child--PaddingInlineStart: var(--#{$card}--m-display-lg--child--PaddingInlineStart);
    --#{$card}--c-divider--child--PaddingBlockStart: var(--#{$card}--m-display-lg--c-divider--child--PaddingBlockStart);
    --#{$card}__title--not--last-child--PaddingBlockEnd: var(--#{$card}--m-display-lg__title--not--last-child--PaddingBlockEnd);
  }

  &.pf-m-secondary {
    --#{$card}--BorderColor: var(--#{$card}--m-secondary--BorderColor);
    --#{$card}--BackgroundColor: var(--#{$card}--m-secondary--BackgroundColor);
  }

  &.pf-m-plain {
    --#{$card}--BorderColor: var(--#{$card}--m-plain--BorderColor);
    --#{$card}--BackgroundColor: var(--#{$card}--m-plain--BackgroundColor);
  }

  &.pf-m-expanded {
    .#{$card}__header-toggle-icon {
      transform: rotate(var(--#{$card}--m-expanded__header-toggle-icon--Rotate));
    }
  }

  &.pf-m-full-height {
    height: var(--#{$card}--m-full-height--Height);
  }

  > .#{$divider} {
    & + .#{$card}__header,
    & + .#{$card}__title,
    & + .#{$card}__body,
    & + .#{$card}__footer {
      padding-block-start: var(--#{$card}--c-divider--child--PaddingBlockStart);
    }
  }
}

.#{$card}__header {
  display: flex;
  flex-direction: row;
  align-items: center;

  .#{$card}__title {
    --#{$card}--first-child--PaddingBlockStart: 0;
    --#{$card}__title--not--last-child--PaddingBlockEnd: 0;

    padding: 0;
  }

  &.pf-m-toggle-right {
    --#{$card}__header-toggle--MarginInlineEnd: var(--#{$card}__header--m-toggle-right--toggle--MarginInlineEnd);
    --#{$card}__header-toggle--MarginInlineStart: var(--#{$card}__header--m-toggle-right--toggle--MarginInlineStart);

    .#{$card}__header-toggle {
      order: 2;
    }
  }
}

.#{$card}__header-main {
  flex-grow: 1;
}

.#{$card}__header-toggle {
  align-self: flex-start;
  margin-block-start: var(--#{$card}__header-toggle--MarginBlockStart);
  margin-block-end: var(--#{$card}__header-toggle--MarginBlockEnd);
  margin-inline-start: var(--#{$card}__header-toggle--MarginInlineStart);
  margin-inline-end: var(--#{$card}__header-toggle--MarginInlineEnd);
}

.#{$card}__header-toggle-icon {
  @include pf-v6-mirror-inline-on-rtl;

  display: inline-block;
  transition: transform var(--#{$card}__header-toggle-icon--TransitionDuration) var(--#{$card}__header-toggle-icon--TransitionTimingFunction);
}

.#{$card}__title-text {
  font-family: var(--#{$card}__title-text--FontFamily);
  font-size: var(--#{$card}__title-text--FontSize);
  font-weight: var(--#{$card}__title-text--FontWeight);
  line-height: var(--#{$card}__title-text--LineHeight);
  color: var(--#{$card}__title-text--Color);
}

.#{$card}__actions {
  display: flex;
  gap: var(--#{$card}__actions--Gap);
  align-items: center;
  align-self: flex-start;
  order: 1;
  padding-inline-start: var(--#{$card}__actions--PaddingInlineStart);
  margin-block-start: var(--#{$card}__actions--MarginBlockStart);
  margin-block-end: var(--#{$card}__actions--MarginBlockEnd);
  margin-inline-start: auto;

  + .#{$card}__title,
  + .#{$card}__body,
  + .#{$card}__footer {
    padding: 0;
  }

  &.pf-m-no-offset {
    --#{$card}__actions--MarginBlockStart: 0;
    --#{$card}__actions--MarginBlockEnd: 0;
  }
}

// Labels are used to handle states of selectable and clickable cards
.#{$card}__selectable-actions :is(.#{$check}__label, .#{$radio}__label, .#{$card}__clickable-action) {
  position: absolute;
  inset: 0;
  justify-self: auto;
  cursor: pointer;

  &::before {
    position: absolute;
    inset: 0;
    z-index: -1;
    content: '';
    background-color: var(--#{$card}--BackgroundColor, transparent);
    border: var(--#{$card}--m-selectable--BorderWidth) solid var(--#{$card}--BorderColor, transparent);
    border-radius: var(--#{$card}--BorderRadius);
  }

  &:hover {
    --#{$card}--BorderColor: var(--#{$card}--m-selectable--hover--BorderColor);
  }
}

// Selected card (checked)
.#{$card}__selectable-actions :is(.#{$check}__input, .#{$radio}__input):where(:checked) ~ :is(.#{$radio}__label, .#{$check}__label),
.#{$card}.pf-m-selected {
  --#{$card}--BorderColor: var(--#{$card}--m-selectable--m-selected--BorderColor);
  --#{$card}--m-selectable--BorderWidth: var(--#{$card}--m-selectable--m-selected--BorderWidth); // this line used to be just BorderWidth, not m-selectable
}

// Focus on the card (focus on label but not checked)
.#{$card}__selectable-actions .#{$card}__clickable-action:where(:focus-visible),
.#{$card}__selectable-actions :is(.#{$check}__input, .#{$radio}__input, .#{$card}__clickable-action):where(:focus-visible) ~ :is(.#{$check}__label, .#{$radio}__label) {
  --#{$card}--BorderColor: var(--#{$card}--m-selectable--focus--BorderColor);
  --#{$card}--BorderWidth: var(--#{$card}--m-selectable--focus--BorderWidth);
}

// Focus on a selected card (focus + checked)
.#{$card}__selectable-actions :is(.#{$check}__input, .#{$radio}__input):where(:focus-visible):where(:checked) ~ :is(.#{$check}__label, .#{$radio}__label) {
  --#{$card}--BorderColor: var(--#{$card}--m-selectable--m-selected--focus--BorderColor);
  --#{$card}--BorderWidth: var(--#{$card}--m-selectable--m-selected--focus--BorderWidth);
}

// Disabled card
.#{$card}__selectable-actions :is(.#{$check}__input, .#{$radio}__input):where(:disabled) ~ :is(.#{$check}__label, .#{$radio}__label),
.#{$card}.pf-m-disabled {
  --#{$card}__title-text--Color: var(--#{$card}--m-selectable--m-disabled__title-text--Color);
  --#{$card}__body--Color: var(--#{$card}--m-selectable--m-disabled__body--Color);
  --#{$card}__footer--Color: var(--#{$card}--m-selectable--m-disabled__footer--Color);
  --#{$card}--BackgroundColor: var(--#{$card}--m-selectable--m-disabled--BackgroundColor);
  --#{$card}--BorderColor: var(--#{$card}--m-selectable--m-disabled--BorderColor);
}

.#{$card}__clickable-action {
  background: none;
  border: 0;
  outline: 0;

  &:disabled,
  &.pf-m-disabled {
    pointer-events: none;
  }
}

.#{$card}__header,
.#{$card}__title,
.#{$card}__body,
.#{$card}__footer {
  padding-block-end: var(--#{$card}--child--PaddingBlockEnd);
  padding-inline-start: var(--#{$card}--child--PaddingInlineStart);
  padding-inline-end: var(--#{$card}--child--PaddingInlineEnd);

  &:first-child {
    padding-block-start: var(--#{$card}--first-child--PaddingBlockStart);
  }
}

.#{$card}__header,
.#{$card}__title {
  &:not(:last-child) {
    padding-block-end: var(--#{$card}__title--not--last-child--PaddingBlockEnd);
  }

  // Normal disabled button color won't show on the disabled card
  .#{$button}.pf-m-inline:disabled {
    --#{$button}--disabled--Color: var(--#{$card}--c-button--disabled--Color);
  }
}

.#{$card}__expandable-content {
  --#{$card}--first-child--PaddingBlockStart: 0;
}

.#{$card}__body:not(.pf-m-no-fill) {
  flex: 1 1 auto;
}

.#{$card}__body {
  font-size: var(--#{$card}__body--FontSize);
  color: var(--#{$card}__body--Color);
}

.#{$card}__footer {
  font-size: var(--#{$card}__footer--FontSize);
  color: var(--#{$card}__footer--Color);
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy