details.pcss.css 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568
  1. /**
  2. * @file
  3. * Collapsible details.
  4. *
  5. * @see collapse.js
  6. */
  7. @import "../base/variables.pcss.css";
  8. /**
  9. * Available modifiers are:
  10. * - .claro-details--accordion
  11. * - .claro-details--accordion-item
  12. *
  13. * Despite the fact that 'accordion' isn't used anywhere right now, we
  14. * implemented it (since the design defines that).
  15. * This variant can be used by setting the '#accordion' to TRUE for a
  16. * Details render element:
  17. * @code
  18. * $build['detail_accordion'] = [
  19. * '#type' => 'details',
  20. * '#accordion' => TRUE,
  21. * ];
  22. *
  23. * 'Accordion item' is used for the details of the node edit sidebar. For
  24. * creating accordion item list from a set of details, set the surrounding
  25. * Container render element's '#accordion' key to TRUE.
  26. *
  27. * 'Vertical tabs item' is used for the children of the VerticalTabs render
  28. * element.
  29. */
  30. :root {
  31. --size-summary-border-radius: calc(var(--details-border-size-radius) - var(--details-border-size));
  32. --summary-accordion-padding-vertical: calc(var(--space-l) + ((var(--space-m) - var(--space-l)) / 2));
  33. --summary-accordion-line-height: var(--space-l);
  34. }
  35. .claro-details {
  36. display: block;
  37. margin-top: var(--space-m);
  38. margin-bottom: var(--space-m);
  39. color: var(--color-text);
  40. border: var(--details-border-size) solid var(--details-border-color);
  41. border-radius: var(--details-border-size-radius);
  42. background-color: var(--color-white);
  43. box-shadow: var(--details-box-shadow);
  44. }
  45. .claro-details--accordion-item,
  46. .claro-details--vertical-tabs-item {
  47. margin-top: 0;
  48. margin-bottom: 0;
  49. border-radius: 0;
  50. box-shadow: none;
  51. }
  52. .claro-details--accordion-item:first-of-type {
  53. border-top-left-radius: var(--details-border-size-radius);
  54. border-top-right-radius: var(--details-border-size-radius);
  55. }
  56. .claro-details--accordion-item:last-of-type {
  57. border-bottom-right-radius: var(--details-border-size-radius);
  58. border-bottom-left-radius: var(--details-border-size-radius);
  59. }
  60. /**
  61. * Details summary styles.
  62. */
  63. .claro-details__summary {
  64. position: relative;
  65. box-sizing: border-box;
  66. padding: var(--space-m) var(--space-m) var(--space-m) var(--details-desktop-wrapper-padding-start); /* LTR */
  67. list-style: none;
  68. cursor: pointer;
  69. transition: background-color var(--details-bg-color-transition-duration) ease-in-out;
  70. word-wrap: break-word;
  71. hyphens: auto;
  72. color: var(--color-davysgrey);
  73. border-radius: var(--size-summary-border-radius);
  74. background-color: transparent;
  75. line-height: var(--space-m);
  76. }
  77. [dir="rtl"] .claro-details__summary {
  78. padding-right: var(--details-desktop-wrapper-padding-start);
  79. padding-left: var(--space-m);
  80. }
  81. /* Modifiers */
  82. .claro-details__summary--accordion,
  83. .claro-details__summary--accordion-item,
  84. .claro-details__summary--vertical-tabs-item {
  85. padding: var(--summary-accordion-padding-vertical) var(--space-l) var(--summary-accordion-padding-vertical) var(--details-desktop-wrapper-padding-start); /* LTR */
  86. background: var(--color-white);
  87. line-height: var(--summary-accordion-line-height);
  88. }
  89. [dir="rtl"] .claro-details__summary--accordion,
  90. [dir="rtl"] .claro-details__summary--accordion-item,
  91. [dir="rtl"] .claro-details__summary--vertical-tabs-item {
  92. padding-right: var(--details-desktop-wrapper-padding-start);
  93. padding-left: var(--space-l);
  94. }
  95. /**
  96. * Accordion list items must not have border radius except they are the first
  97. * or the last ones.
  98. */
  99. .claro-details__summary--accordion-item {
  100. border-radius: 0;
  101. }
  102. .claro-details--accordion-item:first-child .claro-details__summary--accordion-item {
  103. border-top-left-radius: var(--details-border-size-radius);
  104. border-top-right-radius: var(--details-border-size-radius);
  105. }
  106. .claro-details--accordion-item:last-child .claro-details__summary--accordion-item {
  107. border-bottom-right-radius: var(--details-border-size-radius);
  108. border-bottom-left-radius: var(--details-border-size-radius);
  109. }
  110. /**
  111. * Details marker styles.
  112. */
  113. /* Remove the marker on Chrome */
  114. .claro-details__summary::-webkit-details-marker {
  115. display: none;
  116. }
  117. .claro-details__summary::before {
  118. position: absolute;
  119. top: 50%;
  120. left: var(--space-s); /* LTR */
  121. display: inline-block;
  122. width: var(--space-m);
  123. height: var(--space-m);
  124. margin-top: calc(var(--space-m) / -2);
  125. content: "";
  126. transition: transform var(--details-transform-transition-duration) ease-in 0s;
  127. transform: rotate(0); /* LTR */
  128. text-align: center;
  129. background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cpath d='M5.2109375,1.3144531 3.7890625,2.7226562 9.0917969,8.0761719 3.7890625,13.429688 5.2109375,14.837891 11.908203,8.0761719Z' fill='%23545560'/%3E%3C/svg%3E") no-repeat 50% 50%;
  130. background-size: contain;
  131. }
  132. [dir="rtl"] .claro-details__summary::before {
  133. right: var(--space-s);
  134. left: auto;
  135. transform: rotate(180deg);
  136. }
  137. @media (prefers-reduced-motion: reduce) {
  138. .claro-details__summary::before {
  139. transition: none;
  140. }
  141. }
  142. @media screen and (-ms-high-contrast: active) {
  143. .claro-details__summary::before {
  144. width: 0.5625rem;
  145. height: 0.5625rem;
  146. margin-top: calc(0.5625rem / -2);
  147. transition: transform var(--details-transform-transition-duration) ease-in 0s, margin var(--details-transform-transition-duration) ease-in 0s;
  148. transform: rotate(45deg); /* LTR */
  149. border: 0.125rem solid;
  150. border-width: 0.125rem 0.125rem 0 0;
  151. background: none;
  152. }
  153. [dir="rtl"] .claro-details__summary::before {
  154. transform: rotate(225deg);
  155. }
  156. }
  157. /**
  158. * Safari (at least version 12.1) cannot handle our details marker
  159. * transition properly.
  160. *
  161. * Every additional pointer triggered toggle event freezes the transition,
  162. * and the transition is continued and finished after the pointer leaves
  163. * the Detail elements' summary.
  164. *
  165. * Even that it is possible to provide a JavaScript workaround for it (by
  166. * adding/removing a helper class with JavaScript if the Details is
  167. * toggled), that hack will make RTL details worse than without the hack.
  168. *
  169. * This weird query was found in
  170. * https://stackoverflow.com/questions/16348489#25975282 (based on the
  171. * answer it works for Safari 10.1+)
  172. */
  173. /* stylelint-disable-next-line unit-whitelist */
  174. @media not all and (min-resolution: 0.001dpcm) {
  175. @media {
  176. .claro-details__summary::before {
  177. transition: none;
  178. }
  179. }
  180. }
  181. /**
  182. * Details summary focus.
  183. */
  184. .claro-details__summary::after {
  185. position: absolute;
  186. top: -1px;
  187. right: -1px;
  188. bottom: -1px;
  189. left: -1px;
  190. content: "";
  191. transition: opacity var(--details-box-shadow-transition-duration) ease-in-out;
  192. pointer-events: none;
  193. opacity: 0;
  194. border-radius: var(--details-border-size-radius);
  195. box-shadow: inset 0 0 0 var(--details-summary-focus-border-size) var(--details-summary-shadow-color);
  196. }
  197. .claro-details > .claro-details__summary--accordion-item::after,
  198. .vertical-tabs__item > .claro-details__summary--vertical-tabs-item::after {
  199. border-radius: 0;
  200. }
  201. .claro-details:first-child > .claro-details__summary--accordion-item::after,
  202. .vertical-tabs__item--first > .claro-details__summary--vertical-tabs-item::after {
  203. border-top-left-radius: var(--details-border-size-radius);
  204. border-top-right-radius: var(--details-border-size-radius);
  205. }
  206. .claro-details:last-child > .claro-details__summary--accordion-item::after,
  207. .vertical-tabs__item--last > .claro-details__summary--vertical-tabs-item::after {
  208. border-bottom-right-radius: var(--details-border-size-radius);
  209. border-bottom-left-radius: var(--details-border-size-radius);
  210. }
  211. /**
  212. * Focus box of accordions and accordion items must not have bottom border
  213. * radius if their accordion is expanded.
  214. */
  215. .claro-details[open] > .claro-details__summary--accordion::after,
  216. .claro-details[open] > .claro-details__summary--accordion-item::after,
  217. .vertical-tabs__item--last[open] > .claro-details__summary--vertical-tabs-item::after {
  218. border-bottom-right-radius: 0;
  219. border-bottom-left-radius: 0;
  220. }
  221. /**
  222. * Details summary states.
  223. */
  224. .claro-details__summary:focus {
  225. box-shadow: none;
  226. }
  227. [open] .claro-details__summary--accordion,
  228. [open] .claro-details__summary--accordion-item,
  229. [open] .claro-details__summary--vertical-tabs-item {
  230. color: var(--color-absolutezero);
  231. }
  232. .claro-details__summary:hover::before,
  233. .claro-details__summary:hover:focus::before,
  234. .claro-details[open] > .claro-details__summary:focus::before,
  235. .claro-details[open] > .claro-details__summary--accordion::before,
  236. .claro-details[open] > .claro-details__summary--accordion-item::before,
  237. .claro-details[open] > .claro-details__summary--vertical-tabs-item::before {
  238. background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cpath d='M5.2109375,1.3144531 3.7890625,2.7226562 9.0917969,8.0761719 3.7890625,13.429688 5.2109375,14.837891 11.908203,8.0761719Z' fill='%230036B1'/%3E%3C/svg%3E");
  239. }
  240. .claro-details[open] > .claro-details__summary {
  241. border-radius: var(--size-summary-border-radius) var(--size-summary-border-radius) 0 0;
  242. }
  243. .claro-details[open] > .claro-details__summary::before {
  244. transform: rotate(90deg); /* for LTR and RTL */
  245. }
  246. @media screen and (-ms-high-contrast: active) {
  247. .claro-details__summary:hover::before,
  248. .claro-details__summary:hover:focus::before {
  249. background: none;
  250. }
  251. .claro-details[open] > .claro-details__summary::before,
  252. [dir="rtl"] .claro-details[open] > .claro-details__summary::before {
  253. margin-top: calc((0.5625rem / -2) - 0.125rem);
  254. margin-right: 0.125rem;
  255. transform: rotate(135deg); /* for LTR and RTL */
  256. background: none;
  257. }
  258. }
  259. .claro-details[open] > .claro-details__summary--accordion,
  260. .claro-details[open] > .claro-details__summary--accordion-item,
  261. .claro-details[open] > .claro-details__summary--vertical-tabs-item {
  262. box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
  263. }
  264. .claro-details__summary:hover {
  265. color: var(--color-absolutezero);
  266. background-color: var(--color-bgblue-hover);
  267. }
  268. /**
  269. * Focus styles.
  270. */
  271. /**
  272. * Active has to be here for Firefox.
  273. * Merges standard collapse-processed selectors.
  274. */
  275. [open] > .claro-details__summary--accordion:not(:focus):not(:active)::after,
  276. [open] > .claro-details__summary--accordion-item:not(:focus):not(:active)::after,
  277. .collapse-processed[open] > .claro-details__summary--accordion .details-title:not(:focus)::after,
  278. .collapse-processed[open] > .claro-details__summary--accordion-item .details-title:not(:focus)::after,
  279. [open] > .claro-details__summary--vertical-tabs-item:not(:focus):not(:active)::after,
  280. .collapse-processed[open] > .claro-details__summary--vertical-tabs-item .details-title:not(:focus)::after {
  281. opacity: 1;
  282. border: var(--details-summary-focus-border-size) solid var(--color-absolutezero);
  283. border-width: 0 0 0 var(--details-summary-focus-border-size); /* LTR */
  284. box-shadow: none;
  285. }
  286. [dir="rtl"] [open] > .claro-details__summary--accordion:not(:focus)::after,
  287. [dir="rtl"] [open] > .claro-details__summary--accordion-item:not(:focus)::after,
  288. [dir="rtl"] .collapse-processed[open] > .claro-details__summary--accordion .details-title:not(:focus)::after,
  289. [dir="rtl"] .collapse-processed[open] > .claro-details__summary--accordion-item .details-title:not(:focus)::after,
  290. [dir="rtl"] [open] > .claro-details__summary--vertical-tabs-item:not(:focus)::after,
  291. [dir="rtl"] .collapse-processed[open] > .claro-details__summary--vertical-tabs-item .details-title:not(:focus)::after {
  292. border-width: 0 var(--details-summary-focus-border-size) 0 0;
  293. }
  294. .claro-details__summary:focus::after,
  295. .claro-details__summary:active::after,
  296. .collapse-processed > .claro-details__summary .details-title:focus::after {
  297. opacity: 1;
  298. }
  299. /**
  300. * Safari workaround.
  301. */
  302. /* stylelint-disable-next-line unit-whitelist */
  303. @media not all and (min-resolution: 0.001dpcm) {
  304. @media {
  305. .claro-details__summary::after {
  306. transition: none;
  307. }
  308. }
  309. }
  310. .claro-details[open] > .claro-details__summary:focus {
  311. color: var(--color-absolutezero);
  312. }
  313. /**
  314. * Details wrapper and content.
  315. *
  316. * Accordion and accordion-item variants should have an extra background.
  317. * In that case, we render an additional wrapper 'claro-details__content' that
  318. * creates the visual margins around the content, and use the original
  319. * wrapper for setting the background color.
  320. *
  321. * If there is no border or padding defined, margins of parent-child elements
  322. * collapse to the highest value. We want to take benefit of this behavior,
  323. * because the elements inside the details content won't cause too big
  324. * vertical spacing.
  325. */
  326. .claro-details__wrapper,
  327. .claro-details__content {
  328. margin: var(--space-m);
  329. }
  330. .claro-details__wrapper--accordion,
  331. .claro-details__wrapper--accordion-item,
  332. .claro-details__wrapper--vertical-tabs-item {
  333. margin: 0;
  334. }
  335. .claro-details__wrapper--accordion::before,
  336. .claro-details__wrapper--accordion::after,
  337. .claro-details__wrapper--accordion-item::before,
  338. .claro-details__wrapper--accordion-item::after,
  339. .claro-details__wrapper--vertical-tabs-item::before,
  340. .claro-details__wrapper--vertical-tabs-item::after {
  341. display: table;
  342. clear: both;
  343. content: "";
  344. }
  345. .claro-details__wrapper--accordion,
  346. .claro-details__wrapper--accordion-item,
  347. .claro-details__wrapper--vertical-tabs-item {
  348. border-top: var(--details-border-size) solid var(--details-border-color);
  349. background-color: var(--color-whitesmoke-o-40);
  350. }
  351. @media screen and (min-width: 48em) {
  352. .claro-details__wrapper {
  353. margin: var(--space-l) var(--details-desktop-wrapper-padding-start);
  354. }
  355. .claro-details__wrapper--accordion,
  356. .claro-details__wrapper--accordion-item,
  357. .claro-details__wrapper--vertical-tabs-item {
  358. margin: 0;
  359. }
  360. }
  361. @media screen and (min-width: 85em) {
  362. .js .claro-details__wrapper--vertical-tabs-item {
  363. margin: 0;
  364. border-top: 0;
  365. background-color: transparent;
  366. }
  367. }
  368. .claro-details__content--accordion,
  369. .claro-details__content--accordion-item,
  370. .claro-details__content--vertical-tabs-item {
  371. margin: var(--space-m) var(--space-m) var(--space-l);
  372. }
  373. @media screen and (min-width: 85em) {
  374. .vertical-tabs .claro-details__content--vertical-tabs-item {
  375. margin: var(--space-l);
  376. }
  377. }
  378. /* Description. */
  379. .claro-details__description {
  380. margin-bottom: var(--space-m);
  381. color: var(--input-fg-color--description);
  382. font-size: var(--font-size-xs); /* ~13px */
  383. line-height: calc(17rem / 16); /* 17px */
  384. }
  385. .claro-details__description.is-disabled {
  386. color: var(--input--disabled-fg-color);
  387. }
  388. /**
  389. * Collapse processed for non-supporting browsers like IE or Edge.
  390. */
  391. .collapse-processed > .claro-details__summary {
  392. padding: 0;
  393. }
  394. .collapse-processed > .claro-details__summary::after {
  395. content: none;
  396. }
  397. .collapse-processed > .claro-details__summary .details-title {
  398. position: relative;
  399. display: block;
  400. padding: var(--space-m) var(--space-m) var(--space-m) var(--details-desktop-wrapper-padding-start); /* LTR */
  401. text-decoration: none;
  402. color: inherit;
  403. border-radius: var(--size-summary-border-radius);
  404. }
  405. [dir="rtl"] .collapse-processed > .claro-details__summary .details-title {
  406. padding-right: var(--details-desktop-wrapper-padding-start);
  407. padding-left: var(--space-m);
  408. }
  409. .collapse-processed > .claro-details__summary--accordion .details-title,
  410. .collapse-processed > .claro-details__summary--accordion-item .details-title,
  411. .collapse-processed > .claro-details__summary--vertical-tabs-item .details-title {
  412. padding: var(--summary-accordion-padding-vertical) var(--space-l) var(--summary-accordion-padding-vertical) var(--details-desktop-wrapper-padding-start); /* LTR */
  413. }
  414. [dir="rtl"] .collapse-processed > .claro-details__summary--accordion .details-title,
  415. [dir="rtl"] .collapse-processed > .claro-details__summary--accordion-item .details-title,
  416. [dir="rtl"] .collapse-processed > .claro-details__summary--vertical-tabs-item .details-title {
  417. padding-right: var(--details-desktop-wrapper-padding-start);
  418. padding-left: var(--space-l);
  419. }
  420. /* Focus and hover states. */
  421. .collapse-processed > .claro-details__summary .details-title:focus,
  422. .collapse-processed > .claro-details__summary .details-title:hover {
  423. z-index: 1;
  424. text-decoration: none;
  425. outline: none;
  426. box-shadow: none;
  427. }
  428. .collapse-processed > .claro-details__summary .details-title::after {
  429. position: absolute;
  430. top: -1px;
  431. right: -1px;
  432. bottom: -1px;
  433. left: -1px;
  434. content: "";
  435. transition: opacity var(--details-box-shadow-transition-duration) ease-in-out;
  436. pointer-events: none;
  437. opacity: 0;
  438. border: var(--details-summary-focus-border-size) solid var(--color-focus);
  439. border-radius: var(--details-border-size-radius);
  440. }
  441. .collapse-processed > .claro-details__summary .details-title:focus::after {
  442. opacity: 1;
  443. }
  444. /* Accordion item modifiers for the focus box. */
  445. .collapse-processed > .claro-details__summary--accordion-item .details-title::after,
  446. .vertical-tabs__item > .claro-details__summary--vertical-tabs-item .details-title::after {
  447. border-radius: 0;
  448. }
  449. .collapse-processed:first-child > .claro-details__summary--accordion-item .details-title::after,
  450. .vertical-tabs__item--first > .claro-details__summary--vertical-tabs-item .details-title::after {
  451. border-top-left-radius: var(--details-border-size-radius);
  452. border-top-right-radius: var(--details-border-size-radius);
  453. }
  454. .collapse-processed:last-child > .claro-details__summary--accordion-item .details-title::after,
  455. .vertical-tabs__item--last > .claro-details__summary--vertical-tabs-item .details-title::after {
  456. border-bottom-right-radius: var(--details-border-size-radius);
  457. border-bottom-left-radius: var(--details-border-size-radius);
  458. }
  459. .collapse-processed[open] > .claro-details__summary--accordion .details-title::after,
  460. .collapse-processed[open] > .claro-details__summary--accordion-item .details-title::after,
  461. .vertical-tabs__item[open] > .claro-details__summary--vertical-tabs-item .details-title::after {
  462. border-bottom-right-radius: 0;
  463. border-bottom-left-radius: 0;
  464. }
  465. /**
  466. * Hide JS summary from the details polyfill to make it consistent with native
  467. * details elements.
  468. *
  469. * @todo Consider removing this after https://www.drupal.org/node/2493957 has
  470. * been solved.
  471. */
  472. .claro-details__summary--accordion .summary,
  473. .claro-details__summary--accordion-item .summary,
  474. .claro-details__summary--vertical-tabs-item .summary {
  475. display: none;
  476. }
  477. @media screen and (-ms-high-contrast: active) {
  478. .collapse-processed[open] > .claro-details__summary--accordion .details-title:not(:focus)::after,
  479. .collapse-processed[open] > .claro-details__summary--accordion-item .details-title:not(:focus)::after,
  480. .collapse-processed[open] > .claro-details__summary--vertical-tabs-item .details-title:not(:focus)::after {
  481. top: -1px;
  482. right: -1px;
  483. bottom: -1px;
  484. left: -1px;
  485. }
  486. .collapse-processed > .claro-details__summary .details-title::after {
  487. top: -5px;
  488. right: -5px;
  489. bottom: -5px;
  490. left: -5px;
  491. border: 2px dotted;
  492. }
  493. }
  494. .required-mark::after {
  495. display: inline-block;
  496. width: 0.4375rem;
  497. height: 0.4375rem;
  498. margin-right: 0.3em;
  499. margin-left: 0.3em;
  500. content: "";
  501. vertical-align: super;
  502. background-image: url(../../images/core/ee0000/required.svg);
  503. background-repeat: no-repeat;
  504. background-size: 0.4375rem 0.4375rem;
  505. }