dropbutton.css

Dropbutton styles.

1. 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.

File

core/themes/claro/css/components/dropbutton.css

View source
  1. /*
  2. * DO NOT EDIT THIS FILE.
  3. * See the following change record for more information,
  4. * https://www.drupal.org/node/3084859
  5. * @preserve
  6. */
  7. /**
  8. * @file
  9. * Dropbutton styles.
  10. *
  11. * 1. Transparent border is needed for high contrast mode. The border-width has
  12. * to be set with !important to render borders with the defined width in high
  13. * contrast mode Firefox.
  14. */
  15. :root {
  16. /**
  17. * Dropbutton
  18. */
  19. --dropbutton-spacing-size: var(--space-m);
  20. --dropbutton-font-size: var(--font-size-base);
  21. --dropbutton-line-height: var(--space-m);
  22. --dropbutton-toggle-size: 3rem;
  23. --dropbutton-border-size: 1px;
  24. --dropbutton-toggle-size-spacing: var(--dropbutton-border-size);
  25. --dropbutton-border-radius-size: 2px;
  26. --dropbutton-item-max-width: 12.5rem;
  27. /* Variant variables: small. */
  28. --dropbutton-small-spacing-size: 0.625rem;
  29. --dropbutton-small-font-size: var(--font-size-xs);
  30. --dropbutton-small-line-height: 0.75rem;
  31. --dropbutton-small-toggle-size: calc((2 * var(--dropbutton-small-spacing-size)) + var(--dropbutton-small-line-height));
  32. /* Variant variables: extra small. */
  33. --dropbutton-extrasmall-spacing-size: 0.375rem;
  34. --dropbutton-extrasmall-font-size: var(--font-size-xs);
  35. --dropbutton-extrasmall-line-height: 0.75rem;
  36. --dropbutton-extrasmall-toggle-size: calc((2 * var(--dropbutton-extrasmall-spacing-size)) + var(--dropbutton-extrasmall-line-height));
  37. }
  38. .dropbutton-wrapper {
  39. display: inline-flex;
  40. border-radius: var(--button-border-radius-size);
  41. box-shadow: 0 1px 2px rgb(0, 0, 0, 0.25);
  42. }
  43. .form-actions .dropbutton-wrapper,
  44. .field-actions .dropbutton-wrapper {
  45. margin-block: var(--space-xs);
  46. margin-inline: 0 var(--space-m);
  47. }
  48. .dropbutton-widget {
  49. position: relative;
  50. flex: 1 1 auto;
  51. .js .dropbutton-wrapper.open
  52. }
  53. /**
  54. * Dropbutton list.
  55. */
  56. .dropbutton {
  57. display: block;
  58. overflow: visible;
  59. min-width: 6rem; /* Help mitigate long dropbutton text from obscuring other dropbuttons. */
  60. height: var(--dropbutton-toggle-size);
  61. margin: 0;
  62. list-style: none;
  63. }
  64. .dropbutton-widget {
  65. border-radius: var(--button-border-radius-size);
  66. background-color: var(--button-bg-color);
  67. }
  68. /* Variants. */
  69. .dropbutton--small {
  70. height: var(--dropbutton-small-toggle-size);
  71. }
  72. .dropbutton--extrasmall {
  73. height: var(--dropbutton-extrasmall-toggle-size);
  74. }
  75. /**
  76. * First dropbutton list item.
  77. */
  78. .dropbutton--multiple .dropbutton__item:first-of-type {
  79. margin-right: calc(var(--dropbutton-toggle-size) + var(--dropbutton-toggle-size-spacing)); /* LTR */
  80. white-space: nowrap;
  81. [dir="rtl"]
  82. }
  83. /* First dropbutton list item variants */
  84. .no-touchevents .dropbutton--multiple.dropbutton--small .dropbutton__item:first-of-type {
  85. margin-right: calc(var(--dropbutton-small-toggle-size) + var(--dropbutton-toggle-size-spacing)); /* LTR */
  86. white-space: nowrap;
  87. [dir="rtl"]
  88. }
  89. .no-touchevents .dropbutton--multiple.dropbutton--extrasmall .dropbutton__item:first-of-type {
  90. margin-right: calc(var(--dropbutton-extrasmall-toggle-size) + var(--dropbutton-toggle-size-spacing)); /* LTR */
  91. white-space: nowrap;
  92. [dir="rtl"]
  93. }
  94. /**
  95. * Dropbutton toggler.
  96. */
  97. .dropbutton__toggle {
  98. position: absolute;
  99. z-index: 3;
  100. top: 0;
  101. right: 0; /* LTR */
  102. bottom: 0;
  103. width: var(--dropbutton-toggle-size);
  104. height: var(--dropbutton-toggle-size);
  105. border: var(--dropbutton-border-size) solid transparent !important; /* 1 */
  106. border-inline-start: var(--dropbutton-border-size) solid white !important;
  107. border-radius: 0 var(--button-border-radius-size) var(--button-border-radius-size) 0; /* LTR */
  108. background: var(--button-bg-color);
  109. font-size: 1px; /* iOS Safari sets a minimum button-width based on font-size. */
  110. appearance: none;
  111. [dir="rtl"]
  112. &::before {
  113. position: absolute;
  114. top: 50%;
  115. right: 50%;
  116. width: 0.875rem;
  117. height: 0.5625rem;
  118. content: "";
  119. transform: translate(50%, -50%) rotate(0);
  120. background: url("data:image/svg+xml,%3csvg width='14' height='9' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M.238 1.938L1.647.517 7 5.819 12.354.517l1.408 1.421L7 8.636z' fill='%23000f33'/%3e%3c/svg%3e") no-repeat center;
  121. background-size: contain;
  122. }
  123. /* Toggler states. */
  124. &:hover {
  125. color: var(--button-fg-color);
  126. background-color: var(--button--hover-bg-color);
  127. box-shadow: 0 2px 4px rgb(0, 0, 0, 0.25);
  128. }
  129. &:focus {
  130. z-index: 2;
  131. }
  132. &:active {
  133. color: var(--button-fg-color);
  134. background-color: var(--button--active-bg-color);
  135. }
  136. }
  137. .dropbutton-wrapper.open .dropbutton__toggle::before {
  138. transform: translate(50%, -50%) rotate(180deg);
  139. [dir="rtl"]
  140. }
  141. /* Toggler variants */
  142. .no-touchevents .dropbutton--small .dropbutton__toggle {
  143. width: var(--dropbutton-small-toggle-size);
  144. height: var(--dropbutton-small-toggle-size);
  145. }
  146. .no-touchevents .dropbutton--extrasmall .dropbutton__toggle {
  147. width: var(--dropbutton-extrasmall-toggle-size);
  148. height: var(--dropbutton-extrasmall-toggle-size);
  149. }
  150. .no-touchevents .dropbutton--small .dropbutton__toggle::before,
  151. .no-touchevents .dropbutton--extrasmall .dropbutton__toggle::before {
  152. width: 0.75rem; /* 12px */
  153. }
  154. /* High contrast. */
  155. @media (forced-colors: active) {
  156. /* Default. */
  157. .dropbutton__toggle::before {
  158. width: 0.5625rem;
  159. height: 0.5625rem;
  160. margin-top: calc(0.5625rem / (2 * -1.41429));
  161. transform: translate(50%, -50%) rotate(135deg); /* LTR */
  162. border-width: 0.125rem 0.125rem 0 0;
  163. border-style: solid;
  164. background: none;
  165. .dropbutton-wrapper.open
  166. [dir="rtl"] .dropbutton-wrapper.open
  167. }
  168. /* Variants */
  169. .no-touchevents .dropbutton--small .dropbutton__toggle::before,
  170. .no-touchevents .dropbutton--extrasmall .dropbutton__toggle::before {
  171. width: 0.4375rem;
  172. height: 0.4375rem;
  173. margin-top: calc(0.4375rem / (2 * -1.41429));
  174. }
  175. .dropbutton-wrapper.open .dropbutton__toggle::before {
  176. margin-top: calc(0.4375rem / (2 * 1.41429));
  177. }
  178. }
  179. /**
  180. * Item in the first dropbutton list item (that looks like a button).
  181. *
  182. * Duplicates base button styles.
  183. */
  184. .dropbutton__item:first-of-type {
  185. & > * {
  186. display: inline-block;
  187. margin: 0;
  188. padding: calc(var(--dropbutton-spacing-size) - var(--dropbutton-border-size)) calc(var(--space-l) - var(--dropbutton-border-size));
  189. cursor: pointer;
  190. text-align: center;
  191. -webkit-text-decoration: none;
  192. text-decoration: none;
  193. color: var(--button-fg-color);
  194. border: var(--dropbutton-border-size) solid transparent !important; /* 1 */
  195. border-radius: var(--button-border-radius-size);
  196. background-color: var(--button-bg-color);
  197. font-size: var(--dropbutton-font-size);
  198. font-weight: 700;
  199. line-height: var(--dropbutton-line-height);
  200. appearance: none;
  201. -webkit-font-smoothing: antialiased;
  202. }
  203. .dropbutton--multiple & > * {
  204. padding-inline: calc(var(--dropbutton-spacing-size) - var(--dropbutton-border-size));
  205. }
  206. /* Variants */
  207. .no-touchevents .dropbutton--small & > * {
  208. padding-block: calc(var(--dropbutton-small-spacing-size) - var(--dropbutton-border-size));
  209. font-size: var(--dropbutton-small-font-size);
  210. line-height: var(--dropbutton-small-line-height);
  211. }
  212. .no-touchevents .dropbutton--extrasmall & > * {
  213. padding-top: calc(var(--dropbutton-extrasmall-spacing-size) - var(--dropbutton-border-size));
  214. padding-bottom: calc(var(--dropbutton-extrasmall-spacing-size) - var(--dropbutton-border-size));
  215. font-size: var(--dropbutton-extrasmall-font-size);
  216. line-height: var(--dropbutton-extrasmall-line-height);
  217. }
  218. & > *:hover,
  219. & > .button:hover {
  220. -webkit-text-decoration: none;
  221. text-decoration: none;
  222. color: var(--button-fg-color);
  223. background-color: var(--button--hover-bg-color);
  224. box-shadow: 0 2px 4px rgb(0, 0, 0, 0.25);
  225. }
  226. & > *:focus:hover,
  227. & > .button:focus:hover {
  228. box-shadow:
  229. 0 0 0 2px var(--color-white),
  230. 0 0 0 5px var(--color-focus);
  231. }
  232. & > *:focus {
  233. -webkit-text-decoration: none;
  234. text-decoration: none;
  235. }
  236. & > *:active {
  237. color: var(--button-fg-color);
  238. background-color: var(--button--active-bg-color);
  239. }
  240. .dropbutton--multiple & > * {
  241. position: relative;
  242. z-index: 3;
  243. }
  244. .dropbutton--multiple & > *:focus {
  245. z-index: 2;
  246. }
  247. .dropbutton--multiple & > * {
  248. border-radius: var(--button-border-radius-size) 0 0 var(--button-border-radius-size); /* LTR */
  249. }
  250. [dir="rtl"] .dropbutton--multiple & > * {
  251. border-radius: 0 var(--button-border-radius-size) var(--button-border-radius-size) 0;
  252. }
  253. }
  254. .dropbutton > .dropbutton__item > a,
  255. .dropbutton > .dropbutton__item > .button {
  256. display: block;
  257. box-sizing: border-box;
  258. width: 100%;
  259. margin: 0;
  260. text-align: left; /* LTR */
  261. }
  262. [dir="rtl"] .dropbutton > .dropbutton__item > a,
  263. [dir="rtl"] .dropbutton > .dropbutton__item > .button {
  264. text-align: right;
  265. }
  266. .dropbutton-wrapper:not(.open) .dropbutton__item:first-of-type ~ .dropbutton__item {
  267. visibility: hidden;
  268. /**
  269. * By setting a height of 1px, the dropbutton items are hidden
  270. * from view while still occupying minimal space, ensuring the layout remains intact.
  271. */
  272. height: 1px;
  273. }
  274. /**
  275. * Non-first dropbutton list elements.
  276. */
  277. .dropbutton__item:first-of-type ~ .dropbutton__item {
  278. border: var(--dropbutton-border-size) solid var(--color-gray-200);
  279. border-bottom: 0;
  280. box-shadow: 0 2px 10px rgb(0, 0, 0, 0.15);
  281. & ~ .dropbutton__item {
  282. border-top: 0;
  283. }
  284. }
  285. .dropbutton__item ~ .dropbutton__item:last-child {
  286. border-bottom: var(--dropbutton-border-size) solid var(--color-gray-200);
  287. border-radius: 0 0 var(--dropbutton-border-radius-size) var(--dropbutton-border-radius-size);
  288. }
  289. /**
  290. * Dropbutton items of non-first dropbutton list elements.
  291. */
  292. .dropbutton__item:first-of-type ~ .dropbutton__item {
  293. max-width: var(--dropbutton-item-max-width);
  294. }
  295. .dropbutton__item:first-of-type ~ .dropbutton__item > a,
  296. .dropbutton__item:first-of-type ~ .dropbutton__item > .button {
  297. position: relative;
  298. padding: calc(var(--dropbutton-spacing-size) - var(--dropbutton-border-size));
  299. white-space: normal;
  300. -webkit-text-decoration: none;
  301. text-decoration: none;
  302. color: var(--color-gray-800);
  303. border: var(--dropbutton-border-size) solid transparent !important; /* 1 */
  304. border-radius: var(--dropbutton-border-radius-size);
  305. background: var(--color-white);
  306. box-shadow: none;
  307. font-size: var(--dropbutton-font-size);
  308. font-weight: normal;
  309. line-height: var(--dropbutton-line-height);
  310. -webkit-font-smoothing: antialiased;
  311. }
  312. .dropbutton__item:first-of-type ~ .dropbutton__item > a:not(:focus),
  313. .dropbutton__item:first-of-type ~ .dropbutton__item > .button:not(:focus) {
  314. z-index: 1;
  315. }
  316. /* Variants. */
  317. .no-touchevents .dropbutton--small .dropbutton__item:first-of-type ~ .dropbutton__item > a,
  318. .no-touchevents .dropbutton--small .dropbutton__item:first-of-type ~ .dropbutton__item > .button {
  319. padding-top: var(--dropbutton-small-spacing-size);
  320. padding-bottom: var(--dropbutton-small-spacing-size);
  321. font-size: var(--dropbutton-small-font-size);
  322. line-height: var(--dropbutton-small-line-height);
  323. }
  324. .no-touchevents .dropbutton--extrasmall .dropbutton__item:first-of-type ~ .dropbutton__item > a,
  325. .no-touchevents .dropbutton--extrasmall .dropbutton__item:first-of-type ~ .dropbutton__item > .button {
  326. padding-top: var(--dropbutton-extrasmall-spacing-size);
  327. padding-bottom: var(--dropbutton-extrasmall-spacing-size);
  328. font-size: var(--dropbutton-extrasmall-font-size);
  329. line-height: var(--dropbutton-extrasmall-line-height);
  330. }
  331. /* States. */
  332. .dropbutton__item {
  333. & > *:focus {
  334. position: relative;
  335. z-index: 3;
  336. }
  337. &:first-of-type ~ & > *:hover {
  338. color: var(--color-text);
  339. background: var(--color-gray-050);
  340. }
  341. & > .button:not(:focus) {
  342. box-shadow: none;
  343. }
  344. &:first-of-type ~ & > *:focus {
  345. border-color: var(--color-focus) !important; /* 1 */
  346. box-shadow:
  347. inset 0 0 0 1px var(--color-focus),
  348. 0 0 0 1px var(--color-focus);
  349. }
  350. }

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