tabs.pcss.css

Same filename in this branch
  1. main core/themes/olivero/css/components/tabs.pcss.css
  2. main core/themes/claro/css/components/tabs.pcss.css
  3. main core/themes/admin/css/components/tabs.pcss.css
  4. main core/themes/default_admin/migration/css/components/tabs.pcss.css
Same filename and directory in other branches
  1. 10 core/themes/olivero/css/components/tabs.pcss.css
  2. 10 core/themes/claro/css/components/tabs.pcss.css
  3. 11.x core/themes/olivero/css/components/tabs.pcss.css
  4. 11.x core/themes/claro/css/components/tabs.pcss.css
  5. 9 core/themes/olivero/css/components/tabs.pcss.css
  6. 9 core/themes/claro/css/components/tabs.pcss.css
  7. 8.9.x core/themes/claro/css/components/tabs.pcss.css
  8. 11.x core/themes/admin/css/components/tabs.pcss.css
  9. 11.x core/themes/default_admin/css/components/tabs.pcss.css
  10. 11.x core/themes/default_admin/migration/css/components/tabs.pcss.css
/**
 * Tabs.
 */
@custom-media --tabs-horizontal (min-width: 768px);

:root {
  /**
  * Tabs.
  */
  --tabs-border-radius-size: var(--admin-radius-2xs);
  --tabs--focus-height: 3px;
  --tabs--active-height: 3px;
  --tabs-link-height: 3rem; /* 48px */
  --tabs-secondary-link-height: 2.5rem; /* 40px */
  --tabs-base-border: 1px solid var(--admin-color-border);
  --tabs-trigger-border: 1px solid rgb(216, 217, 224, 0.8);
}

.tabs-wrapper {
  box-sizing: border-box;
  padding: 0 var(--admin-space-xs);
  margin-inline: calc(var(--admin-space-xs) * -1);

  *,
  *::before,
  *::after {
    box-sizing: border-box;
  }

  @media (--tabs-horizontal) {
    display: flex;
    padding: 0;
  }
}

.tabs {
  display: flex;
  flex-direction: column;
  margin: 0 0 var(--admin-space-l);
  list-style: none;
  border: var(--tabs-base-border);
  border-radius: var(--tabs-border-radius-size);
  inline-size: 100%;

  &.is-open {
    .tabs__tab.is-active::before {
      border-end-start-radius: 0;
    }
  }

  .is-horizontal & {
    @media (--tabs-horizontal) {
      flex-direction: row;
      align-items: flex-end;
      width: 100%;
      margin: 0;
      border: 0;
      padding-block: 0;
      padding-inline: var(--admin-space-xs);
    }
  }

  .gin--dark-mode & {
    border-color: var(--admin-color-border);

    .tabs-wrapper:not(.is-horizontal) & {
      border-color: #8e929c;
    }
  }
}

.tabs--primary {
  @media (--tabs-horizontal) {
    margin-block-end: 0;

    .gin--high-contrast-mode .is-horizontal &::after {
      border-block-end: 1px solid;
    }
  }
}

.tabs--secondary {
  .is-horizontal & {
    @media (--tabs-horizontal) {
      position: relative; /* Anchor ::after */
      overflow: hidden;
      margin-inline: calc(calc(var(--tabs--focus-height) + 3px) * -1);
      padding-block: calc(var(--tabs--focus-height) + 3px) 0;
      padding-inline: calc(var(--tabs--focus-height) + 3px);
      border-radius: 0;

      &::before {
        width: 100%;
      }

      &::after {
        position: absolute;
        display: block;
        width: 100%;
        max-width: calc(100% - var(--admin-space-m));
        content: "";
        pointer-events: none;
        border-block-end: 1px solid var(--admin-color-border);
        inset-block-end: 0;
        inset-inline-start: 0;
      }

      .tabs__tab {
        font-size: var(--admin-font-size-s);
      }

      .tabs__link {
        min-block-size: var(--tabs-secondary-link-height);
        padding-block: var(--admin-space-xs);

        &:focus {
          min-block-size: var(--tabs-secondary-link-height);
        }
      }
    }
  }
}

.tabs__tab {
  position: relative;
  border-block-end: var(--tabs-base-border);
  background-color: var(--admin-color-bg-surface-nested);
  font-size: var(--admin-font-size-s);
  font-weight: var(--admin-font-weight-semibold);

  &:last-child {
    border-block-end: 0;
  }

  &.is-active {
    display: flex;
    justify-content: space-between;

    /* Vertical line that indicates active state. */
    &::before {
      z-index: 2;
      inset-block-start: -1px;
      inset-inline-start: -1px;
      inline-size: var(--tabs--active-height);
      block-size: calc(100% + 2px);
      border-inline-start: var(--tabs--active-height) solid var(--admin-color-primary);
      border-start-start-radius: var(--tabs-border-radius-size);
    }
  }

  .is-horizontal .tabs--primary & {
    border-block-end: 1px solid var(--admin-color-border);
    background-color: var(--admin-color-bg-surface);

    &:not(:is(.is-active, .tabs.is-open > *)) {
      display: none;

      @media (--tabs-horizontal) {
        display: flex;
      }
    }

    /* Remove the bottom border from the first tab only if the tabs group is closed. */
    &[data-original-order="0"]:not(.tabs.is-open *) {
      border-block-end: none;
    }

    @media (--tabs-horizontal) {
      border-block-end: none;
      background-color: unset;
    }
  }

  .is-horizontal & {
    @media (--tabs-horizontal) {
      display: block;
      border-block: none;
      background: none;
      font-size: var(--admin-font-size-m);

      &.is-active {
        order: 0;

        &::before {
          content: none;
        }
      }
    }
  }

  .gin--dark-mode & {
    &,
    &.is-active {
      border-color: var(--admin-color-border);
      background-color: transparent;
    }

    .tabs-wrapper:not(.is-horizontal) & {
      border-color: #8e929c;
      background-color: var(--admin-color-bg-item-hover);
    }
  }
}

.tabs__link {
  display: flex;
  flex-grow: 1;
  align-items: center;
  text-decoration: none;
  color: var(--admin-color-text);
  /* font-weight: var(--admin-font-weight-semibold); */
  background-color: var(--admin-color-bg-surface);
  line-height: 1.2rem;
  padding-block: var(--admin-space-s);
  padding-inline: var(--admin-space-l);

  &:hover {
    text-decoration: none;
    color: var(--admin-color-text);
  }

  &.is-active {
    position: relative;

    &:hover {
      color: var(--admin-color-text);
    }

    &::before {
      position: absolute;
      z-index: 2;
      top: -1px;
      width: var(--tabs--active-height);
      height: calc(100% + 2px);
      content: "";
      border-inline-start: 3px solid var(--admin-color-link);
      inset-inline-start: -1px;
      border-start-start-radius: var(--tabs-border-radius-size);
    }

    @media (--tabs-horizontal) {
      &::before {
        content: none;
      }
    }
  }

  &:not(.is-active):focus {
    z-index: 3;
  }

  .is-horizontal .tabs--primary & {
    height: 100%;
    min-height: 2rem;
    margin-inline-end: 0.25em;
    font-size: var(--admin-font-size-m);
    padding-block: calc(var(--admin-space-l) - var(--admin-space-2xs));
    padding-inline: var(--admin-space-l);

    &.is-active {
      color: var(--admin-color-primary-active);
    }

    @media (--tabs-horizontal) {
      min-height: 2rem;
      margin-inline-end: 0.25em;
      border-radius: 2rem;
      font-size: var(--admin-font-size-m);
      padding-block: calc(var(--admin-space-xs) - 2px);
      padding-inline: var(--admin-space-s);

      &.is-active {
        border: solid 1px transparent; /* Forced-colors mode. */
        background: var(--admin-color-primary-soft);
      }
    }
  }

  .is-horizontal .tabs--secondary & {
    @media (--tabs-horizontal) {
      padding: var(--admin-space-m);
      border-radius: var(--admin-radius-m) var(--admin-radius-m) 0 0;

      &.is-active {
        color: var(--admin-color-primary);

        &::before {
          all: revert;
          position: absolute;
          content: "";
          inset: auto 0 0;
          border-block-end: var(--tabs--active-height) solid var(--admin-color-primary);
        }
      }
    }
  }

  .is-horizontal &:is(:hover, :focus) {
    color: var(--admin-color-primary);
    background: var(--admin-color-bg-item-hover);
  }

  @media (--tabs-horizontal) {
    text-align: center;
    text-wrap: balance;
    background: unset;
  }
}

.tabs__trigger {
  display: flex;
  flex-shrink: 0;
  align-items: center;
  justify-content: center;
  margin: 0;
  padding: 0;
  padding-inline-end: 1px;
  cursor: pointer;
  text-align: center;
  border: 0;
  border-inline-start: var(--tabs-trigger-border);
  background-color: var(--admin-color-bg-surface);
  line-height: inherit;
  appearance: none;
  inline-size: var(--tabs-link-height);

  &:focus {
    z-index: 1;
  }

  path {
    fill: currentColor;
    stroke: currentColor;
  }

  .is-horizontal & {
    @media (--tabs-horizontal) {
      display: none;
    }
  }

  @media (forced-colors: active) {
    svg path {
      fill: currentColor;
    }
  }
}

File

core/themes/default_admin/css/components/tabs.pcss.css

View source
  1. /**
  2. * Tabs.
  3. */
  4. @custom-media --tabs-horizontal (min-width: 768px);
  5. :root {
  6. /**
  7. * Tabs.
  8. */
  9. --tabs-border-radius-size: var(--admin-radius-2xs);
  10. --tabs--focus-height: 3px;
  11. --tabs--active-height: 3px;
  12. --tabs-link-height: 3rem; /* 48px */
  13. --tabs-secondary-link-height: 2.5rem; /* 40px */
  14. --tabs-base-border: 1px solid var(--admin-color-border);
  15. --tabs-trigger-border: 1px solid rgb(216, 217, 224, 0.8);
  16. }
  17. .tabs-wrapper {
  18. box-sizing: border-box;
  19. padding: 0 var(--admin-space-xs);
  20. margin-inline: calc(var(--admin-space-xs) * -1);
  21. *,
  22. *::before,
  23. *::after {
  24. box-sizing: border-box;
  25. }
  26. @media (--tabs-horizontal) {
  27. display: flex;
  28. padding: 0;
  29. }
  30. }
  31. .tabs {
  32. display: flex;
  33. flex-direction: column;
  34. margin: 0 0 var(--admin-space-l);
  35. list-style: none;
  36. border: var(--tabs-base-border);
  37. border-radius: var(--tabs-border-radius-size);
  38. inline-size: 100%;
  39. &.is-open {
  40. .tabs__tab.is-active::before {
  41. border-end-start-radius: 0;
  42. }
  43. }
  44. .is-horizontal
  45. }
  46. .gin--dark-mode
  47. }
  48. }
  49. .tabs--primary {
  50. @media (--tabs-horizontal) {
  51. margin-block-end: 0;
  52. .gin--high-contrast-mode .is-horizontal &::after {
  53. border-block-end: 1px solid;
  54. }
  55. }
  56. }
  57. .tabs--secondary {
  58. .is-horizontal
  59. &::after {
  60. position: absolute;
  61. display: block;
  62. width: 100%;
  63. max-width: calc(100% - var(--admin-space-m));
  64. content: "";
  65. pointer-events: none;
  66. border-block-end: 1px solid var(--admin-color-border);
  67. inset-block-end: 0;
  68. inset-inline-start: 0;
  69. }
  70. .tabs__tab {
  71. font-size: var(--admin-font-size-s);
  72. }
  73. .tabs__link {
  74. min-block-size: var(--tabs-secondary-link-height);
  75. padding-block: var(--admin-space-xs);
  76. &:focus {
  77. min-block-size: var(--tabs-secondary-link-height);
  78. }
  79. }
  80. }
  81. }
  82. }
  83. .tabs__tab {
  84. position: relative;
  85. border-block-end: var(--tabs-base-border);
  86. background-color: var(--admin-color-bg-surface-nested);
  87. font-size: var(--admin-font-size-s);
  88. font-weight: var(--admin-font-weight-semibold);
  89. &:last-child {
  90. border-block-end: 0;
  91. }
  92. &.is-active {
  93. display: flex;
  94. justify-content: space-between;
  95. /* Vertical line that indicates active state. */
  96. &::before {
  97. z-index: 2;
  98. inset-block-start: -1px;
  99. inset-inline-start: -1px;
  100. inline-size: var(--tabs--active-height);
  101. block-size: calc(100% + 2px);
  102. border-inline-start: var(--tabs--active-height) solid var(--admin-color-primary);
  103. border-start-start-radius: var(--tabs-border-radius-size);
  104. }
  105. }
  106. .is-horizontal .tabs--primary
  107. }
  108. /* Remove the bottom border from the first tab only if the tabs group is closed. */
  109. &[data-original-order="0"]:not(.tabs.is-open *) {
  110. border-block-end: none;
  111. }
  112. @media (--tabs-horizontal) {
  113. border-block-end: none;
  114. background-color: unset;
  115. }
  116. }
  117. .is-horizontal
  118. }
  119. }
  120. }
  121. .gin--dark-mode
  122. .tabs-wrapper:not(.is-horizontal)
  123. }
  124. }
  125. .tabs__link {
  126. display: flex;
  127. flex-grow: 1;
  128. align-items: center;
  129. text-decoration: none;
  130. color: var(--admin-color-text);
  131. /* font-weight: var(--admin-font-weight-semibold); */
  132. background-color: var(--admin-color-bg-surface);
  133. line-height: 1.2rem;
  134. padding-block: var(--admin-space-s);
  135. padding-inline: var(--admin-space-l);
  136. &:hover {
  137. text-decoration: none;
  138. color: var(--admin-color-text);
  139. }
  140. &.is-active {
  141. position: relative;
  142. &:hover {
  143. color: var(--admin-color-text);
  144. }
  145. &::before {
  146. position: absolute;
  147. z-index: 2;
  148. top: -1px;
  149. width: var(--tabs--active-height);
  150. height: calc(100% + 2px);
  151. content: "";
  152. border-inline-start: 3px solid var(--admin-color-link);
  153. inset-inline-start: -1px;
  154. border-start-start-radius: var(--tabs-border-radius-size);
  155. }
  156. @media (--tabs-horizontal) {
  157. &::before {
  158. content: none;
  159. }
  160. }
  161. }
  162. &:not(.is-active):focus {
  163. z-index: 3;
  164. }
  165. .is-horizontal .tabs--primary
  166. @media (--tabs-horizontal) {
  167. min-height: 2rem;
  168. margin-inline-end: 0.25em;
  169. border-radius: 2rem;
  170. font-size: var(--admin-font-size-m);
  171. padding-block: calc(var(--admin-space-xs) - 2px);
  172. padding-inline: var(--admin-space-s);
  173. &.is-active {
  174. border: solid 1px transparent; /* Forced-colors mode. */
  175. background: var(--admin-color-primary-soft);
  176. }
  177. }
  178. }
  179. .is-horizontal .tabs--secondary
  180. }
  181. }
  182. }
  183. .is-horizontal &:is(:hover, :focus) {
  184. color: var(--admin-color-primary);
  185. background: var(--admin-color-bg-item-hover);
  186. }
  187. @media (--tabs-horizontal) {
  188. text-align: center;
  189. text-wrap: balance;
  190. background: unset;
  191. }
  192. }
  193. .tabs__trigger {
  194. display: flex;
  195. flex-shrink: 0;
  196. align-items: center;
  197. justify-content: center;
  198. margin: 0;
  199. padding: 0;
  200. padding-inline-end: 1px;
  201. cursor: pointer;
  202. text-align: center;
  203. border: 0;
  204. border-inline-start: var(--tabs-trigger-border);
  205. background-color: var(--admin-color-bg-surface);
  206. line-height: inherit;
  207. appearance: none;
  208. inline-size: var(--tabs-link-height);
  209. &:focus {
  210. z-index: 1;
  211. }
  212. path {
  213. fill: currentColor;
  214. stroke: currentColor;
  215. }
  216. .is-horizontal
  217. }
  218. @media (forced-colors: active) {
  219. svg path {
  220. fill: currentColor;
  221. }
  222. }
  223. }

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.