Chris@0
|
1 /**
|
Chris@0
|
2 * @file
|
Chris@0
|
3 * Provides responsive behaviors to HTML details elements.
|
Chris@0
|
4 */
|
Chris@0
|
5
|
Chris@17
|
6 (function($, Drupal) {
|
Chris@0
|
7 /**
|
Chris@0
|
8 * Initializes the responsive behaviors for details elements.
|
Chris@0
|
9 *
|
Chris@0
|
10 * @type {Drupal~behavior}
|
Chris@0
|
11 *
|
Chris@0
|
12 * @prop {Drupal~behaviorAttach} attach
|
Chris@0
|
13 * Attaches the responsive behavior to status report specific details elements.
|
Chris@0
|
14 */
|
Chris@0
|
15 Drupal.behaviors.responsiveDetails = {
|
Chris@0
|
16 attach(context) {
|
Chris@17
|
17 const $details = $(context)
|
Chris@17
|
18 .find('details')
|
Chris@17
|
19 .once('responsive-details');
|
Chris@0
|
20
|
Chris@0
|
21 if (!$details.length) {
|
Chris@0
|
22 return;
|
Chris@0
|
23 }
|
Chris@0
|
24
|
Chris@17
|
25 const $summaries = $details.find('> summary');
|
Chris@17
|
26
|
Chris@0
|
27 function detailsToggle(matches) {
|
Chris@0
|
28 if (matches) {
|
Chris@0
|
29 $details.attr('open', true);
|
Chris@0
|
30 $summaries.attr('aria-expanded', true);
|
Chris@0
|
31 $summaries.on('click.details-open', false);
|
Chris@17
|
32 } else {
|
Chris@0
|
33 // If user explicitly opened one, leave it alone.
|
Chris@0
|
34 const $notPressed = $details
|
Chris@0
|
35 .find('> summary[aria-pressed!=true]')
|
Chris@0
|
36 .attr('aria-expanded', false);
|
Chris@17
|
37 $notPressed.parent('details').attr('open', false);
|
Chris@0
|
38 // After resize, allow user to close previously opened details.
|
Chris@0
|
39 $summaries.off('.details-open');
|
Chris@0
|
40 }
|
Chris@0
|
41 }
|
Chris@0
|
42
|
Chris@0
|
43 function handleDetailsMQ(event) {
|
Chris@0
|
44 detailsToggle(event.matches);
|
Chris@0
|
45 }
|
Chris@0
|
46
|
Chris@0
|
47 const mql = window.matchMedia('(min-width:48em)');
|
Chris@0
|
48 mql.addListener(handleDetailsMQ);
|
Chris@0
|
49 detailsToggle(mql.matches);
|
Chris@0
|
50 },
|
Chris@0
|
51 };
|
Chris@17
|
52 })(jQuery, Drupal);
|