admin-toolbar.pcss.css

Admin Toolbar styles.

File

core/modules/navigation/css/components/admin-toolbar.pcss.css

View source
  1. /* cspell:ignore csvg cpath */
  2. /**
  3. * @file
  4. * Admin Toolbar styles.
  5. */
  6. @import "../base/media-queries.pcss.css";
  7. /**
  8. * Sidebar width is attached to the element because it's used as a
  9. * fallback value to the margin-inline-start property of the layout container.
  10. */
  11. body {
  12. --admin-toolbar-sidebar-width: calc(4.5 * var(--admin-toolbar-rem));
  13. --admin-toolbar-sidebar-header: calc(3.5 * var(--admin-toolbar-rem));
  14. [data-admin-toolbar="expanded"]
  15. }
  16. }
  17. /* We apply transitions after page load to avoid shifts. */
  18. [data-admin-toolbar-transitions] {
  19. :is(#extra-specificity-hack, [data-drupal-admin-styles]) {
  20. &.admin-toolbar {
  21. transition: transform var(--admin-toolbar-transition);
  22. @media (--admin-toolbar-desktop) {
  23. transition: width var(--admin-toolbar-transition);
  24. ~ .dialog-off-canvas-main-canvas {
  25. transition: margin-inline-start var(--admin-toolbar-transition);
  26. }
  27. }
  28. }
  29. }
  30. }
  31. /**
  32. * This zero height div has the [data-offset-left] attribute for
  33. * Drupal.displace() to measure. It purposefully does not have any transitions
  34. * because we want Drupal.displace() to measure the width immediately
  35. */
  36. :is(#extra-specificity-hack, [data-drupal-admin-styles]) {
  37. .admin-toolbar__displace-placeholder {
  38. position: absolute;
  39. inset-block-start: 0;
  40. inset-inline-start: 0;
  41. @media (--admin-toolbar-desktop) {
  42. width: var(--admin-toolbar-sidebar-width);
  43. }
  44. }
  45. }
  46. /**
  47. * The Admin toolbar component.
  48. */
  49. :is(#extra-specificity-hack, [data-drupal-admin-styles]) {
  50. &.admin-toolbar {
  51. position: fixed;
  52. inset-block-start: 0;
  53. inset-inline-start: 0;
  54. z-index: var(--admin-toolbar-z-index);
  55. display: flex;
  56. flex-direction: column;
  57. block-size: 100vh;
  58. transform: translateX(-100%);
  59. background-color: var(--admin-toolbar-color-white);
  60. font-family: var(--admin-toolbar-font-family);
  61. inline-size: calc(var(--admin-toolbar-sidebar-width) + 1px);
  62. [dir="rtl"]
  63. }
  64. & ~ .dialog-off-canvas-main-canvas {
  65. @media (--admin-toolbar-desktop) {
  66. margin-inline-start: var(--drupal-displace-offset-left, var(--admin-toolbar-sidebar-width));
  67. [dir="rtl"]
  68. }
  69. }
  70. [data-admin-toolbar="expanded"]
  71. @media (--admin-toolbar-desktop) {
  72. transform: none;
  73. inset-block-start: 0;
  74. }
  75. @media only screen and (max-height: 300px) {
  76. min-height: 20rem;
  77. }
  78. }
  79. .admin-toolbar__back-button {
  80. display: none;
  81. flex-grow: 0;
  82. }
  83. &.admin-toolbar:has([data-toolbar-popover-control][aria-expanded="true"]) {
  84. .admin-toolbar__back-button {
  85. display: flex;
  86. @media (--admin-toolbar-desktop) {
  87. display: none;
  88. }
  89. }
  90. .admin-toolbar__logo {
  91. display: none;
  92. @media (--admin-toolbar-desktop) {
  93. display: inline-flex;
  94. }
  95. }
  96. }
  97. .admin-toolbar__close-button {
  98. flex-grow: 0;
  99. justify-self: end;
  100. margin-inline-start: auto;
  101. @media (--admin-toolbar-desktop) {
  102. display: none;
  103. }
  104. }
  105. .admin-toolbar__expand-button {
  106. display: none;
  107. align-items: center;
  108. justify-content: center;
  109. width: calc(2.25 * var(--admin-toolbar-rem));
  110. height: calc(2.25 * var(--admin-toolbar-rem));
  111. margin-inline-start: calc(0.125 * var(--admin-toolbar-rem));
  112. cursor: pointer;
  113. color: var(--admin-toolbar-color-gray-800);
  114. border: 1px solid var(--admin-toolbar-color-gray-300);
  115. border-radius: 50%;
  116. background-color: transparent;
  117. &:hover {
  118. color: var(--admin-toolbar-color-gray-990);
  119. }
  120. @media (--admin-toolbar-desktop) {
  121. display: flex;
  122. }
  123. }
  124. .admin-toolbar__expand-button-chevron {
  125. flex-shrink: 0;
  126. fill: currentColor;
  127. width: calc(1 * var(--admin-toolbar-rem));
  128. height: calc(1 * var(--admin-toolbar-rem));
  129. transition:
  130. opacity var(--admin-toolbar-transition),
  131. rotate var(--admin-toolbar-transition);
  132. opacity: 0;
  133. [data-admin-toolbar-transitions]
  134. [dir="rtl"]
  135. .admin-toolbar__expand-button[aria-expanded="true"]
  136. }
  137. }
  138. .admin-toolbar__header {
  139. position: sticky;
  140. z-index: var(--admin-toolbar-z-index-header);
  141. inset-block-start: 0;
  142. display: flex;
  143. align-items: center;
  144. justify-content: space-between;
  145. margin-block-start: calc(var(--admin-toolbar-sidebar-header) * -1);
  146. padding-block-start: var(--admin-toolbar-space-16);
  147. background-color: var(--admin-toolbar-color-white);
  148. & + .toolbar-block {
  149. margin-block-start: calc(var(--admin-toolbar-space-10) * -1);
  150. @media (--admin-toolbar-desktop) {
  151. margin-block-start: 0;
  152. }
  153. }
  154. &:not(:has(.admin-toolbar__logo)) {
  155. @media (--admin-toolbar-desktop) {
  156. display: none;
  157. }
  158. }
  159. @media (--admin-toolbar-desktop) {
  160. position: static;
  161. align-items: start;
  162. margin-block-start: revert;
  163. padding-block-start: revert;
  164. padding-block-end: 0;
  165. }
  166. }
  167. .admin-toolbar__logo {
  168. display: inline-flex;
  169. overflow: hidden;
  170. border-radius: var(--admin-toolbar-space-8);
  171. &:hover {
  172. background-color: transparent;
  173. }
  174. & img {
  175. display: block;
  176. max-width: var(--admin-toolbar-space-40);
  177. }
  178. }
  179. /**
  180. * Scroll wrapper for Mobile.
  181. */
  182. .admin-toolbar__scroll-wrapper {
  183. display: flex;
  184. overflow-y: auto;
  185. flex-direction: column;
  186. height: 100%;
  187. background: linear-gradient(var(--admin-toolbar-color-white) 30%, var(--admin-toolbar-color-white)), radial-gradient(farthest-side at 50% 0, var(--admin-toolbar-color-shadow-15), var(--admin-toolbar-color-shadow-0));
  188. background-color: var(--admin-toolbar-color-white);
  189. background-repeat: no-repeat;
  190. background-attachment: local, scroll;
  191. background-position-y: 48px;
  192. background-size:
  193. 100% 40px,
  194. 100% 16px;
  195. @media (--admin-toolbar-desktop) {
  196. display: contents;
  197. overflow-y: unset;
  198. background: none;
  199. }
  200. }
  201. /**
  202. * Content region.
  203. * Region where most of the content will be printed.
  204. */
  205. .admin-toolbar__content {
  206. display: grid;
  207. gap: var(--admin-toolbar-space-12);
  208. padding-block: var(--admin-toolbar-sidebar-header) var(--admin-toolbar-space-16);
  209. padding-inline: var(--admin-toolbar-space-16);
  210. border-inline-end: 1px solid var(--admin-toolbar-color-gray-100);
  211. @media (--admin-toolbar-desktop) {
  212. display: flex;
  213. overflow-x: hidden;
  214. overflow-y: auto;
  215. flex-direction: column;
  216. flex-grow: 1;
  217. padding-block-start: var(--admin-toolbar-space-16);
  218. background:
  219. linear-gradient(var(--admin-toolbar-color-white) 30%, var(--admin-toolbar-color-white)),
  220. linear-gradient(var(--admin-toolbar-color-white), var(--admin-toolbar-color-white) 80%) 0 100%,
  221. radial-gradient(farthest-side at 50% 0, var(--admin-toolbar-color-shadow-15), var(--admin-toolbar-color-shadow-0)),
  222. radial-gradient(farthest-side at 50% 100%, var(--admin-toolbar-color-shadow-15), var(--admin-toolbar-color-shadow-0)) 0 100%;
  223. background-color: var(--admin-toolbar-color-white);
  224. background-repeat: no-repeat;
  225. background-attachment: local, local, scroll, scroll;
  226. background-size:
  227. 100% 40px,
  228. 100% 40px,
  229. 100% 16px,
  230. 100% 16px;
  231. }
  232. }
  233. /**
  234. * Sticky bottom region.
  235. * Region with less used items and button for collapse.
  236. */
  237. .admin-toolbar__footer {
  238. z-index: var(--admin-toolbar-z-index-footer);
  239. display: grid;
  240. gap: var(--admin-toolbar-space-4);
  241. margin-block-start: auto;
  242. padding: var(--admin-toolbar-space-16);
  243. border-block-start: 1px solid var(--admin-toolbar-color-gray-200);
  244. border-inline-end: 1px solid var(--admin-toolbar-color-gray-100);
  245. & > .toolbar-block {
  246. &:last-of-type {
  247. margin-block-end: var(--admin-toolbar-space-12);
  248. }
  249. }
  250. @media (--admin-toolbar-desktop) {
  251. --admin-toolbar-z-index-footer: -1;
  252. position: sticky;
  253. bottom: 0;
  254. background-color: var(--admin-toolbar-color-white);
  255. }
  256. }
  257. /**
  258. * Sidebar toggle.
  259. */
  260. .admin-toolbar__toggle {
  261. display: none;
  262. @media (--admin-toolbar-desktop) {
  263. display: flex;
  264. }
  265. }
  266. [data-drupal-tooltip]:hover + .admin-toolbar__tooltip,
  267. [data-drupal-tooltip]:focus + .admin-toolbar__tooltip {
  268. [data-admin-toolbar="expanded"]
  269. }
  270. }
  271. /**
  272. * Element is used to overlay the content when Toolbar is expanded in smaller devices.
  273. * It is created in the template templates/navigation.html.twig.
  274. */
  275. :is(#extra-specificity-hack, [data-drupal-admin-styles]) {
  276. &.admin-toolbar-overlay {
  277. position: fixed;
  278. z-index: var(--admin-toolbar-z-index-overlay);
  279. inset-block-start: 0;
  280. inset-inline-start: 0;
  281. display: none;
  282. width: 100vw;
  283. height: 100vh;
  284. background-color: rgb(0, 0, 0, 0.14);
  285. :where([data-admin-toolbar="expanded"])
  286. @media (--admin-toolbar-desktop) {
  287. display: none;
  288. }
  289. }
  290. }

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