dropbutton.pcss.css

Same filename in this branch
  1. main core/misc/dialog/off-canvas/css/dropbutton.pcss.css
  2. main core/themes/olivero/css/components/dropbutton.pcss.css
  3. main core/themes/claro/css/components/dropbutton.pcss.css
  4. main core/themes/admin/css/components/dropbutton.pcss.css
Same filename and directory in other branches
  1. 10 core/misc/dialog/off-canvas/css/dropbutton.pcss.css
  2. 10 core/themes/olivero/css/components/dropbutton.pcss.css
  3. 10 core/themes/claro/css/components/dropbutton.pcss.css
  4. 11.x core/misc/dialog/off-canvas/css/dropbutton.pcss.css
  5. 11.x core/themes/olivero/css/components/dropbutton.pcss.css
  6. 11.x core/themes/claro/css/components/dropbutton.pcss.css
  7. 9 core/themes/olivero/css/components/dropbutton.pcss.css
  8. 9 core/themes/claro/css/components/dropbutton.pcss.css
  9. 8.9.x core/themes/claro/css/components/dropbutton.pcss.css
  10. 11.x core/themes/admin/css/components/dropbutton.pcss.css
  11. 11.x core/themes/default_admin/css/components/dropbutton.pcss.css

Dropbutton styles.

Transparent border is needed for high contrast mode. The border-width has to be set with !important to render borders with the defined width in high contrast mode Firefox.

@todo This file is overcomplicated and needs to be refactored.

File

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

View source
  1. /**
  2. * @file
  3. * Dropbutton styles.
  4. *
  5. * Transparent border is needed for high contrast mode. The border-width has to
  6. * be set with !important to render borders with the defined width in high
  7. * contrast mode Firefox.
  8. *
  9. * @todo This file is overcomplicated and needs to be refactored.
  10. */
  11. :root {
  12. /**
  13. * Dropbutton
  14. */
  15. --dropbutton-spacing-size: var(--space-m);
  16. --dropbutton-font-size: var(--font-size-base);
  17. --dropbutton-line-height: var(--space-m);
  18. --dropbutton-toggle-size: 3rem;
  19. --dropbutton-border-size: 1px;
  20. --dropbutton-toggle-size-spacing: var(--dropbutton-border-size);
  21. --dropbutton-border-radius-size: 2px;
  22. --dropbutton-item-max-width: 12.5rem;
  23. /* Variant variables: small. */
  24. --dropbutton-small-spacing-size: 0.625rem;
  25. --dropbutton-small-font-size: var(--font-size-xs);
  26. --dropbutton-small-line-height: 0.75rem;
  27. --dropbutton-small-toggle-size: calc((2 * var(--dropbutton-small-spacing-size)) + var(--dropbutton-small-line-height));
  28. /* Variant variables: extra small. */
  29. --dropbutton-extrasmall-spacing-size: 0.375rem;
  30. --dropbutton-extrasmall-font-size: var(--font-size-xs);
  31. --dropbutton-extrasmall-line-height: 0.75rem;
  32. --dropbutton-extrasmall-toggle-size: calc((2 * var(--dropbutton-extrasmall-spacing-size)) + var(--dropbutton-extrasmall-line-height));
  33. }
  34. .dropbutton-wrapper {
  35. display: inline-flex;
  36. border-radius: var(--button-border-radius-size);
  37. box-shadow: none;
  38. }
  39. .form-actions .dropbutton-wrapper,
  40. .field-actions .dropbutton-wrapper {
  41. margin-block: var(--space-xs);
  42. margin-inline: 0 var(--space-m);
  43. }
  44. .dropbutton-widget {
  45. position: relative;
  46. flex: 1 1 auto;
  47. border-radius: var(--button-border-radius-size);
  48. background-color: transparent;
  49. .js .dropbutton-wrapper.open
  50. }
  51. /**
  52. * Dropbutton list.
  53. */
  54. .dropbutton {
  55. display: block;
  56. overflow: visible;
  57. min-width: 6rem;
  58. /* Help mitigate long dropbutton text from obscuring other dropbuttons. */
  59. height: var(--dropbutton-toggle-size);
  60. margin: 0;
  61. list-style: none;
  62. border: 2px solid var(--gin-color-primary);
  63. border-radius: var(--gin-border-m);
  64. box-shadow: 0 1px 2px var(--gin-color-primary-light);
  65. .gin--dark-mode
  66. &:hover {
  67. border-color: var(--gin-color-primary);
  68. }
  69. &:active {
  70. border-color: var(--gin-color-primary-active);
  71. }
  72. .dropbutton__items {
  73. position: absolute;
  74. min-width: 120px;
  75. margin: 0;
  76. padding: 0.5em;
  77. list-style: none;
  78. border-radius: var(--gin-border-l);
  79. background: var(--gin-bg-layer3);
  80. box-shadow: var(--gin-shadow-l2);
  81. inset-inline-end: 0;
  82. .node-form
  83. @media (forced-colors: active) {
  84. border: 1px solid linktext;
  85. }
  86. }
  87. > .dropbutton__items > .dropbutton__item:first-of-type {
  88. > a,
  89. > input,
  90. > .button {
  91. border-radius: var(--gin-border-s) var(--gin-border-s) 0 0;
  92. }
  93. }
  94. /* Drupal 10.2.x fix */
  95. &.dropbutton--gin .dropbutton-action > .button {
  96. border: var(--dropbutton-border-size) solid transparent !important;
  97. }
  98. /* The ugly part: make it work for all different dropbutton versions out there */
  99. &:not(.dropbutton--gin) > .dropbutton__item ~ .dropbutton__item,
  100. .dropbutton__items > .dropbutton__item,
  101. .dropbutton__items > .dropbutton__item ~ .dropbutton__item {
  102. border: 0 none;
  103. background-color: var(--gin-bg-app);
  104. box-shadow: none;
  105. &:first-of-type {
  106. margin-inline-end: 0;
  107. }
  108. /* Multiple Dropbutton only has one item */
  109. &:first-of-type:last-of-type > * {
  110. .js .dropbutton--multiple
  111. }
  112. > a,
  113. > input,
  114. > .button {
  115. display: block;
  116. overflow: hidden;
  117. box-sizing: border-box;
  118. width: 100%;
  119. max-width: 320px;
  120. margin: 0;
  121. text-align: start;
  122. white-space: nowrap;
  123. text-overflow: ellipsis;
  124. color: var(--gin-color-primary);
  125. border: 0 none !important;
  126. border-radius: 0;
  127. background: var(--gin-bg-layer3);
  128. box-shadow: none;
  129. font-weight: var(--gin-font-weight-heavy);
  130. &:focus {
  131. outline-offset: -2px;
  132. }
  133. &:hover,
  134. &:active {
  135. color: var(--gin-color-button-text);
  136. border-radius: var(--gin-border-s);
  137. background: var(--gin-color-primary);
  138. }
  139. }
  140. }
  141. & > .dropbutton__item:first-of-type {
  142. > a,
  143. > input,
  144. > .button {
  145. &:hover,
  146. &:active {
  147. color: var(--gin-color-button-text);
  148. background: var(--gin-color-primary);
  149. }
  150. }
  151. }
  152. .dropbutton__items > .dropbutton__item {
  153. border-radius: var(--gin-border-s);
  154. }
  155. /* Shadow for pseudo dropdown on views page */
  156. &:not(.dropbutton--gin) > .dropbutton__item.secondary-action {
  157. box-shadow: var(--gin-shadow-l2);
  158. }
  159. &:not(.dropbutton--gin) > .dropbutton__item:not(:first-of-type),
  160. .dropbutton__items > .dropbutton__item,
  161. > .dropbutton__items > .dropbutton__item ~ .dropbutton__item {
  162. > a,
  163. > input,
  164. > .button {
  165. padding: 0.75em 1em !important;
  166. font-size: var(--gin-font-size-s) !important;
  167. }
  168. }
  169. }
  170. /* Variants. */
  171. .dropbutton--small {
  172. height: var(--dropbutton-small-toggle-size);
  173. }
  174. .dropbutton--extrasmall {
  175. height: var(--dropbutton-extrasmall-toggle-size);
  176. }
  177. /**
  178. * First dropbutton list item.
  179. */
  180. .dropbutton--multiple .dropbutton__item:first-of-type {
  181. height: 100%;
  182. margin-right: calc(var(--dropbutton-toggle-size) + var(--dropbutton-toggle-size-spacing));
  183. white-space: nowrap;
  184. border-inline-end: 1px solid var(--gin-color-primary-light-active);
  185. input {
  186. height: 100%;
  187. color: var(--gin-color-primary);
  188. border: 0 none !important;
  189. border-radius: 0 !important;
  190. background-color: transparent;
  191. }
  192. /* LTR */
  193. [dir="rtl"]
  194. }
  195. /* First dropbutton list item variants */
  196. .no-touchevents .dropbutton--multiple.dropbutton--small .dropbutton__item:first-of-type {
  197. margin-right: calc(var(--dropbutton-small-toggle-size) + var(--dropbutton-toggle-size-spacing));
  198. /* LTR */
  199. white-space: nowrap;
  200. [dir="rtl"]
  201. }
  202. .no-touchevents .dropbutton--multiple.dropbutton--extrasmall .dropbutton__item:first-of-type {
  203. margin-right: calc(var(--dropbutton-extrasmall-toggle-size) + var(--dropbutton-toggle-size-spacing));
  204. /* LTR */
  205. white-space: nowrap;
  206. [dir="rtl"]
  207. }
  208. /**
  209. * Dropbutton toggler.
  210. */
  211. .dropbutton__toggle {
  212. position: absolute;
  213. z-index: 3;
  214. top: 0;
  215. right: 0;
  216. inset-block-start: 2px;
  217. inset-inline-end: 2px;
  218. bottom: 0;
  219. width: calc(var(--gin-spacing-xxl) + 1px);
  220. height: 2.75rem;
  221. white-space: nowrap;
  222. border: var(--dropbutton-border-size) solid transparent !important;
  223. /* 1 */
  224. border-inline-start: var(--dropbutton-border-size, 1px) solid var(--gin-color-primary) !important;
  225. border-radius: 0 var(--button-border-radius-size) var(--button-border-radius-size) 0;
  226. /* LTR */
  227. background: none;
  228. box-shadow: none;
  229. font-size: var(--gin-font-size-s);
  230. font-weight: var(--gin-font-weight-semibold);
  231. appearance: none;
  232. [dir="rtl"]
  233. &::before {
  234. position: absolute;
  235. top: 50%;
  236. right: 50%;
  237. width: 0.875rem;
  238. height: 0.5625rem;
  239. content: "";
  240. transform: translate(50%, -50%) rotate(0);
  241. background: url(../../images/icons/000f33/chevron-down.svg) no-repeat center;
  242. background-size: contain;
  243. }
  244. /* Toggler states. */
  245. &:hover {
  246. color: var(--gin-color-button-text);
  247. background-color: var(--gin-color-primary);
  248. box-shadow: 0 2px 4px rgb(0, 0, 0, 0.25);
  249. }
  250. &:focus {
  251. z-index: 2;
  252. }
  253. &:active {
  254. color: var(--gin-color-button-text);
  255. background-color: var(--button--active-bg-color);
  256. }
  257. @media (prefers-reduced-motion: no-preference) {
  258. transition: var(--gin-transition);
  259. }
  260. @media (--admin-wide) {
  261. font-size: var(--gin-font-size);
  262. }
  263. @media (forced-colors: active) {
  264. border-width: 0 !important;
  265. }
  266. @media not (forced-colors: active) {
  267. &::before {
  268. background-color: var(--gin-color-primary);
  269. background-image: none;
  270. mask-image: var(--admin-icon-drop);
  271. mask-repeat: no-repeat;
  272. mask-position: center center;
  273. mask-size: 12px 12px;
  274. }
  275. &:hover::before,
  276. &:active::before {
  277. background-color: var(--gin-color-button-text);
  278. }
  279. }
  280. }
  281. .dropbutton-wrapper.open .dropbutton__toggle::before {
  282. transform: translate(50%, -50%) rotate(180deg);
  283. [dir="rtl"]
  284. }
  285. /* Toggler variants */
  286. .no-touchevents .dropbutton--small .dropbutton__toggle {
  287. width: var(--dropbutton-small-toggle-size);
  288. height: var(--dropbutton-small-toggle-size);
  289. }
  290. .no-touchevents .dropbutton--extrasmall .dropbutton__toggle {
  291. width: var(--dropbutton-extrasmall-toggle-size);
  292. height: var(--dropbutton-extrasmall-toggle-size);
  293. }
  294. .no-touchevents .dropbutton--small .dropbutton__toggle::before,
  295. .no-touchevents .dropbutton--extrasmall .dropbutton__toggle::before {
  296. width: 0.75rem;
  297. /* 12px */
  298. }
  299. /* High contrast. */
  300. @media (forced-colors: active) {
  301. /* Default. */
  302. .dropbutton__toggle::before {
  303. width: 0.5625rem;
  304. height: 0.5625rem;
  305. margin-top: calc(0.5625rem / (2 * -1.41429));
  306. transform: translate(50%, -50%) rotate(135deg);
  307. /* LTR */
  308. border-width: 0.125rem 0.125rem 0 0;
  309. border-style: solid;
  310. background: none;
  311. .dropbutton-wrapper.open
  312. [dir="rtl"] .dropbutton-wrapper.open
  313. }
  314. /* Variants */
  315. .no-touchevents .dropbutton--small .dropbutton__toggle::before,
  316. .no-touchevents .dropbutton--extrasmall .dropbutton__toggle::before {
  317. width: 0.4375rem;
  318. height: 0.4375rem;
  319. margin-top: calc(0.4375rem / (2 * -1.41429));
  320. }
  321. .dropbutton-wrapper.open .dropbutton__toggle::before {
  322. margin-top: calc(0.4375rem / (2 * 1.41429));
  323. }
  324. }
  325. /**
  326. * Item in the first dropbutton list item (that looks like a button).
  327. *
  328. * Duplicates base button styles.
  329. */
  330. .dropbutton__item:first-of-type {
  331. & > * {
  332. display: inline-flex;
  333. align-items: center;
  334. box-sizing: border-box;
  335. margin: 0;
  336. padding: calc(0.875rem - 1px) calc(var(--gin-spacing-l) - 1px);
  337. cursor: pointer;
  338. text-align: center;
  339. white-space: nowrap;
  340. text-decoration: none;
  341. color: var(--gin-color-primary);
  342. border: var(--dropbutton-border-size) solid transparent !important;
  343. /* 1 */
  344. border-radius: var(--button-border-radius-size);
  345. background: none;
  346. box-shadow: none;
  347. font-size: var(--gin-font-size-s);
  348. font-weight: var(--gin-font-weight-semibold);
  349. line-height: var(--dropbutton-line-height);
  350. appearance: none;
  351. -webkit-font-smoothing: antialiased;
  352. /* This is a fix for when an is the first item within a dropdown.
  353. This can be replicated using the theming_tools development contrib module. */
  354. &:not(:is(:hover)) {
  355. color: var(--gin-color-primary) !important;
  356. }
  357. &:hover {
  358. background-color: var(--gin-color-primary-hover);
  359. }
  360. &:active {
  361. background-color: var(--gin-color-primary-active);
  362. }
  363. &:hover,
  364. &:active {
  365. color: var(--gin-color-button-text);
  366. }
  367. @media (prefers-reduced-motion: no-preference) {
  368. transition: var(--gin-transition);
  369. }
  370. @media (--admin-wide) {
  371. font-size: var(--gin-font-size);
  372. }
  373. @media (forced-colors: active) {
  374. border-width: 0 !important;
  375. }
  376. }
  377. .dropbutton--multiple & > * {
  378. padding-inline: calc(var(--dropbutton-spacing-size) - var(--dropbutton-border-size));
  379. }
  380. /* Variants */
  381. .no-touchevents .dropbutton--small & > * {
  382. padding-block: calc(var(--dropbutton-small-spacing-size) - var(--dropbutton-border-size));
  383. font-size: var(--dropbutton-small-font-size);
  384. line-height: var(--dropbutton-small-line-height);
  385. }
  386. .no-touchevents .dropbutton--extrasmall & > * {
  387. padding-top: calc(var(--dropbutton-extrasmall-spacing-size) - var(--dropbutton-border-size));
  388. padding-bottom: calc(var(--dropbutton-extrasmall-spacing-size) - var(--dropbutton-border-size));
  389. font-size: var(--dropbutton-extrasmall-font-size);
  390. line-height: var(--dropbutton-extrasmall-line-height);
  391. }
  392. & > *:hover,
  393. & > .button:hover {
  394. text-decoration: none;
  395. color: var(--button-fg-color);
  396. background-color: var(--button--hover-bg-color);
  397. box-shadow: 0 2px 4px rgb(0, 0, 0, 0.25);
  398. }
  399. & > *:active {
  400. color: var(--button-fg-color);
  401. background-color: var(--button--active-bg-color);
  402. }
  403. .dropbutton--multiple & > * {
  404. position: relative;
  405. z-index: 3;
  406. }
  407. .dropbutton--multiple & > *:focus {
  408. z-index: 2;
  409. }
  410. .dropbutton--multiple & > * {
  411. border-radius: var(--button-border-radius-size) 0 0 var(--button-border-radius-size);
  412. /* LTR */
  413. }
  414. & ~ .dropbutton__item__item ~ .dropbutton__item:last-child {
  415. border-color: var(--gin-color-primary);
  416. }
  417. [dir="rtl"] .dropbutton--multiple & > * {
  418. border-radius: 0 var(--button-border-radius-size) var(--button-border-radius-size) 0;
  419. }
  420. }
  421. .dropbutton > .dropbutton__item > a,
  422. .dropbutton > .dropbutton__item > .button {
  423. display: block;
  424. box-sizing: border-box;
  425. width: 100%;
  426. margin: 0;
  427. text-align: left;
  428. /* LTR */
  429. }
  430. [dir="rtl"] .dropbutton > .dropbutton__item > a,
  431. [dir="rtl"] .dropbutton > .dropbutton__item > .button {
  432. text-align: right;
  433. }
  434. .dropbutton-wrapper:not(.open) .dropbutton__item:first-of-type ~ .dropbutton__item {
  435. visibility: hidden;
  436. /**
  437. * By setting a height of 1px, the dropbutton items are hidden
  438. * from view while still occupying minimal space, ensuring the layout remains intact.
  439. */
  440. height: 1px;
  441. }
  442. /**
  443. * Non-first dropbutton list elements.
  444. */
  445. .dropbutton__item:first-of-type ~ .dropbutton__item {
  446. max-width: unset;
  447. border: var(--dropbutton-border-size) solid var(--gin-color-primary);
  448. border-bottom: 0;
  449. box-shadow: 0 2px 10px rgb(0, 0, 0, 0.15);
  450. & ~ .dropbutton__item {
  451. border-top: 0;
  452. }
  453. & > *:hover {
  454. background-color: var(--gin-bg-layer3);
  455. }
  456. }
  457. .dropbutton__item ~ .dropbutton__item:last-child {
  458. border-bottom: var(--dropbutton-border-size) solid var(--color-gray-200);
  459. border-radius: 0 0 var(--dropbutton-border-radius-size) var(--dropbutton-border-radius-size);
  460. }
  461. /**
  462. * Dropbutton items of non-first dropbutton list elements.
  463. */
  464. .dropbutton__item:first-of-type ~ .dropbutton__item {
  465. max-width: var(--dropbutton-item-max-width);
  466. }
  467. .dropbutton__item:first-of-type ~ .dropbutton__item > a,
  468. .dropbutton__item:first-of-type ~ .dropbutton__item > .button {
  469. position: relative;
  470. padding: calc(var(--dropbutton-spacing-size) - var(--dropbutton-border-size));
  471. white-space: normal;
  472. text-decoration: none;
  473. color: var(--color-gray-800);
  474. border: var(--dropbutton-border-size) solid transparent !important;
  475. /* 1 */
  476. border-radius: var(--dropbutton-border-radius-size);
  477. background: var(--color-white);
  478. box-shadow: none;
  479. font-size: var(--dropbutton-font-size);
  480. font-weight: normal;
  481. line-height: var(--dropbutton-line-height);
  482. -webkit-font-smoothing: antialiased;
  483. }
  484. .dropbutton__item:first-of-type ~ .dropbutton__item > a:not(:focus),
  485. .dropbutton__item:first-of-type ~ .dropbutton__item > .button:not(:focus) {
  486. z-index: 1;
  487. }
  488. /* Variants. */
  489. .no-touchevents .dropbutton--small .dropbutton__item:first-of-type ~ .dropbutton__item > a,
  490. .no-touchevents .dropbutton--small .dropbutton__item:first-of-type ~ .dropbutton__item > .button {
  491. padding-top: var(--dropbutton-small-spacing-size);
  492. padding-bottom: var(--dropbutton-small-spacing-size);
  493. font-size: var(--dropbutton-small-font-size);
  494. line-height: var(--dropbutton-small-line-height);
  495. }
  496. .no-touchevents .dropbutton--extrasmall .dropbutton__item:first-of-type ~ .dropbutton__item > a,
  497. .no-touchevents .dropbutton--extrasmall .dropbutton__item:first-of-type ~ .dropbutton__item > .button {
  498. padding-top: var(--dropbutton-extrasmall-spacing-size);
  499. padding-bottom: var(--dropbutton-extrasmall-spacing-size);
  500. font-size: var(--dropbutton-extrasmall-font-size);
  501. line-height: var(--dropbutton-extrasmall-line-height);
  502. }
  503. /* States. */
  504. .dropbutton__item {
  505. & > *:focus {
  506. position: relative;
  507. z-index: 3;
  508. }
  509. &:first-of-type ~ & > *:hover {
  510. color: var(--color-text);
  511. background: var(--color-gray-050);
  512. }
  513. & > .button:not(:focus) {
  514. box-shadow: none;
  515. }
  516. &:first-of-type ~ & > *:focus {
  517. border-color: var(--color-focus) !important;
  518. /* 1 */
  519. box-shadow:
  520. inset 0 0 0 1px var(--color-focus),
  521. 0 0 0 1px var(--color-focus);
  522. }
  523. }
  524. /* Overlay the dropdown button on top of the sticky header and main toolbar */
  525. html.js {
  526. .dropbutton-wrapper.open {
  527. .dropbutton-widget {
  528. z-index: 502;
  529. /* Above toolbar and sticky header */
  530. }
  531. .dropbutton {
  532. background: var(--gin-bg-layer3);
  533. }
  534. }
  535. .dropbutton {
  536. box-sizing: border-box;
  537. height: 3rem;
  538. min-height: 3rem;
  539. }
  540. .dropbutton-wrapper:not(.open) .dropbutton__items {
  541. visibility: hidden;
  542. opacity: 0;
  543. }
  544. .dropbutton-wrapper .dropbutton__items {
  545. visibility: visible;
  546. overflow: auto;
  547. max-height: 30vh;
  548. opacity: 1;
  549. }
  550. .dropbutton-wrapper:not(.open) .dropbutton__item:first-of-type ~ .dropbutton__items {
  551. display: none;
  552. }
  553. .dropbutton-wrapper:not(.open) .dropbutton__items .dropbutton__item:first-of-type ~ .dropbutton__item {
  554. display: block;
  555. height: auto;
  556. }
  557. }
  558. html.js.no-touchevents {
  559. .dropbutton--multiple.dropbutton--small .dropbutton__item:first-of-type {
  560. margin-inline-end: 0;
  561. }
  562. .dropbutton--multiple.dropbutton--small > .dropbutton__item:first-of-type {
  563. margin-inline-end: var(--gin-spacing-xl);
  564. }
  565. .dropbutton--multiple.dropbutton--extrasmall > .dropbutton__item:first-of-type {
  566. margin-inline-end: var(--gin-spacing-l);
  567. }
  568. .dropbutton--small {
  569. min-width: 0;
  570. height: 2.25rem;
  571. min-height: 2.25rem;
  572. border-radius: var(--gin-border-s);
  573. .dropbutton__toggle {
  574. width: calc(var(--dropbutton-small-toggle-size, 2rem) + 1px);
  575. }
  576. }
  577. .dropbutton--extrasmall {
  578. min-width: 0;
  579. height: 1.75rem;
  580. min-height: 1.75rem;
  581. border-radius: var(--gin-border-s);
  582. .dropbutton__toggle {
  583. width: calc(var(--dropbutton-extrasmall-toggle-size, 1.5rem) + 1px);
  584. }
  585. .dropbutton__item:first-of-type > * {
  586. padding-inline: var(--gin-spacing-s);
  587. }
  588. }
  589. .dropbutton--multiple.dropbutton--extrasmall .dropbutton__items .dropbutton__item {
  590. margin-inline-end: 0;
  591. }
  592. }

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