govuk_tech_docs 3.0.1 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of govuk_tech_docs might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/lib/govuk_tech_docs/version.rb +1 -1
- data/lib/source/layouts/_header.erb +3 -3
- data/lib/source/layouts/core.erb +1 -1
- data/node_modules/govuk-frontend/govuk/all.js +272 -75
- data/node_modules/govuk-frontend/govuk/components/accordion/_index.scss +275 -98
- data/node_modules/govuk-frontend/govuk/components/accordion/accordion.js +169 -65
- data/node_modules/govuk-frontend/govuk/components/button/_index.scss +3 -4
- data/node_modules/govuk-frontend/govuk/components/button/button.js +2 -2
- data/node_modules/govuk-frontend/govuk/components/character-count/character-count.js +3 -3
- data/node_modules/govuk-frontend/govuk/components/checkboxes/_index.scss +14 -0
- data/node_modules/govuk-frontend/govuk/components/checkboxes/checkboxes.js +8 -10
- data/node_modules/govuk-frontend/govuk/components/cookie-banner/_index.scss +0 -2
- data/node_modules/govuk-frontend/govuk/components/details/_index.scss +2 -1
- data/node_modules/govuk-frontend/govuk/components/details/details.js +2 -2
- data/node_modules/govuk-frontend/govuk/components/error-message/_index.scss +1 -0
- data/node_modules/govuk-frontend/govuk/components/error-summary/error-summary.js +2 -2
- data/node_modules/govuk-frontend/govuk/components/file-upload/_index.scss +1 -0
- data/node_modules/govuk-frontend/govuk/components/footer/_index.scss +6 -37
- data/node_modules/govuk-frontend/govuk/components/header/_index.scss +10 -4
- data/node_modules/govuk-frontend/govuk/components/header/header.js +4 -4
- data/node_modules/govuk-frontend/govuk/components/hint/_index.scss +1 -3
- data/node_modules/govuk-frontend/govuk/components/input/_index.scss +1 -1
- data/node_modules/govuk-frontend/govuk/components/notification-banner/notification-banner.js +499 -2
- data/node_modules/govuk-frontend/govuk/components/panel/_index.scss +13 -1
- data/node_modules/govuk-frontend/govuk/components/radios/_index.scss +14 -0
- data/node_modules/govuk-frontend/govuk/components/radios/radios.js +4 -4
- data/node_modules/govuk-frontend/govuk/components/select/_index.scss +1 -1
- data/node_modules/govuk-frontend/govuk/components/skip-link/_index.scss +13 -0
- data/node_modules/govuk-frontend/govuk/components/skip-link/skip-link.js +1108 -0
- data/node_modules/govuk-frontend/govuk/components/summary-list/_index.scss +15 -23
- data/node_modules/govuk-frontend/govuk/components/tabs/_index.scss +2 -2
- data/node_modules/govuk-frontend/govuk/components/tabs/tabs.js +2 -2
- data/node_modules/govuk-frontend/govuk/components/tag/_index.scss +0 -5
- data/node_modules/govuk-frontend/govuk/components/textarea/_index.scss +1 -1
- data/node_modules/govuk-frontend/govuk/core/_all.scss +0 -1
- data/node_modules/govuk-frontend/govuk/core/_global-styles.scss +0 -6
- data/node_modules/govuk-frontend/govuk/core/_links.scss +0 -6
- data/node_modules/govuk-frontend/govuk/core/_lists.scss +0 -6
- data/node_modules/govuk-frontend/govuk/core/_section-break.scss +0 -6
- data/node_modules/govuk-frontend/govuk/core/_typography.scss +0 -6
- data/node_modules/govuk-frontend/govuk/helpers/_colour.scss +2 -2
- data/node_modules/govuk-frontend/govuk/helpers/_spacing.scss +22 -4
- data/node_modules/govuk-frontend/govuk/objects/_all.scss +1 -0
- data/node_modules/govuk-frontend/govuk/objects/_main-wrapper.scss +15 -30
- data/node_modules/govuk-frontend/govuk/{core → objects}/_template.scss +1 -5
- data/node_modules/govuk-frontend/govuk/overrides/_all.scss +1 -0
- data/node_modules/govuk-frontend/govuk/overrides/_display.scss +0 -6
- data/node_modules/govuk-frontend/govuk/overrides/_spacing.scss +0 -6
- data/node_modules/govuk-frontend/govuk/overrides/_text-align.scss +14 -0
- data/node_modules/govuk-frontend/govuk/overrides/_typography.scss +0 -6
- data/node_modules/govuk-frontend/govuk/overrides/_width.scss +0 -6
- data/node_modules/govuk-frontend/govuk/settings/_colours-organisations.scss +3 -0
- data/node_modules/govuk-frontend/govuk/settings/_measurements.scss +0 -10
- data/node_modules/govuk-frontend/govuk/tools/_all.scss +0 -1
- data/package-lock.json +3 -3
- data/package.json +1 -1
- metadata +5 -4
- data/node_modules/govuk-frontend/govuk/tools/_iff.scss +0 -17
@@ -1,7 +1,7 @@
|
|
1
1
|
(function (global, factory) {
|
2
2
|
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
3
|
-
typeof define === 'function' && define.amd ? define('GOVUKFrontend', factory) :
|
4
|
-
(global.GOVUKFrontend = factory());
|
3
|
+
typeof define === 'function' && define.amd ? define('GOVUKFrontend.Accordion', factory) :
|
4
|
+
(global.GOVUKFrontend = global.GOVUKFrontend || {}, global.GOVUKFrontend.Accordion = factory());
|
5
5
|
}(this, (function () { 'use strict';
|
6
6
|
|
7
7
|
/**
|
@@ -762,19 +762,28 @@ function Accordion ($module) {
|
|
762
762
|
this.$module = $module;
|
763
763
|
this.moduleId = $module.getAttribute('id');
|
764
764
|
this.$sections = $module.querySelectorAll('.govuk-accordion__section');
|
765
|
-
this.$
|
765
|
+
this.$showAllButton = '';
|
766
766
|
this.browserSupportsSessionStorage = helper.checkForSessionStorage();
|
767
767
|
|
768
768
|
this.controlsClass = 'govuk-accordion__controls';
|
769
|
-
this.
|
770
|
-
this.
|
769
|
+
this.showAllClass = 'govuk-accordion__show-all';
|
770
|
+
this.showAllTextClass = 'govuk-accordion__show-all-text';
|
771
771
|
|
772
|
+
this.sectionExpandedClass = 'govuk-accordion__section--expanded';
|
773
|
+
this.sectionButtonClass = 'govuk-accordion__section-button';
|
772
774
|
this.sectionHeaderClass = 'govuk-accordion__section-header';
|
773
|
-
this.sectionHeaderFocusedClass = 'govuk-accordion__section-header--focused';
|
774
775
|
this.sectionHeadingClass = 'govuk-accordion__section-heading';
|
776
|
+
this.sectionHeadingTextClass = 'govuk-accordion__section-heading-text';
|
777
|
+
this.sectionHeadingTextFocusClass = 'govuk-accordion__section-heading-text-focus';
|
778
|
+
|
779
|
+
this.sectionShowHideToggleClass = 'govuk-accordion__section-toggle';
|
780
|
+
this.sectionShowHideToggleFocusClass = 'govuk-accordion__section-toggle-focus';
|
781
|
+
this.sectionShowHideTextClass = 'govuk-accordion__section-toggle-text';
|
782
|
+
this.upChevronIconClass = 'govuk-accordion-nav__chevron';
|
783
|
+
this.downChevronIconClass = 'govuk-accordion-nav__chevron--down';
|
784
|
+
|
775
785
|
this.sectionSummaryClass = 'govuk-accordion__section-summary';
|
776
|
-
this.
|
777
|
-
this.sectionExpandedClass = 'govuk-accordion__section--expanded';
|
786
|
+
this.sectionSummaryFocusClass = 'govuk-accordion__section-summary-focus';
|
778
787
|
}
|
779
788
|
|
780
789
|
// Initialize component
|
@@ -785,32 +794,39 @@ Accordion.prototype.init = function () {
|
|
785
794
|
}
|
786
795
|
|
787
796
|
this.initControls();
|
788
|
-
|
789
797
|
this.initSectionHeaders();
|
790
798
|
|
791
|
-
// See if "
|
799
|
+
// See if "Show all sections" button text should be updated
|
792
800
|
var areAllSectionsOpen = this.checkIfAllSectionsOpen();
|
793
|
-
this.
|
801
|
+
this.updateShowAllButton(areAllSectionsOpen);
|
794
802
|
};
|
795
803
|
|
796
804
|
// Initialise controls and set attributes
|
797
805
|
Accordion.prototype.initControls = function () {
|
798
|
-
// Create "
|
799
|
-
this.$
|
800
|
-
this.$
|
801
|
-
this.$
|
802
|
-
this.$
|
803
|
-
this.$openAllButton.setAttribute('aria-expanded', 'false');
|
804
|
-
this.$openAllButton.setAttribute('type', 'button');
|
806
|
+
// Create "Show all" button and set attributes
|
807
|
+
this.$showAllButton = document.createElement('button');
|
808
|
+
this.$showAllButton.setAttribute('type', 'button');
|
809
|
+
this.$showAllButton.setAttribute('class', this.showAllClass);
|
810
|
+
this.$showAllButton.setAttribute('aria-expanded', 'false');
|
805
811
|
|
806
|
-
// Create
|
807
|
-
var
|
808
|
-
|
809
|
-
|
810
|
-
this.$module.insertBefore(accordionControls, this.$module.firstChild);
|
812
|
+
// Create icon, add to element
|
813
|
+
var $icon = document.createElement('span');
|
814
|
+
$icon.classList.add(this.upChevronIconClass);
|
815
|
+
this.$showAllButton.appendChild($icon);
|
811
816
|
|
812
|
-
//
|
813
|
-
|
817
|
+
// Create control wrapper and add controls to it
|
818
|
+
var $accordionControls = document.createElement('div');
|
819
|
+
$accordionControls.setAttribute('class', this.controlsClass);
|
820
|
+
$accordionControls.appendChild(this.$showAllButton);
|
821
|
+
this.$module.insertBefore($accordionControls, this.$module.firstChild);
|
822
|
+
|
823
|
+
// Build additional wrapper for Show all toggle text and place after icon
|
824
|
+
var $wrappershowAllText = document.createElement('span');
|
825
|
+
$wrappershowAllText.classList.add(this.showAllTextClass);
|
826
|
+
this.$showAllButton.appendChild($wrappershowAllText);
|
827
|
+
|
828
|
+
// Handle click events on the show/hide all button
|
829
|
+
this.$showAllButton.addEventListener('click', this.onShowOrHideAllToggle.bind(this));
|
814
830
|
};
|
815
831
|
|
816
832
|
// Initialise section headers
|
@@ -818,13 +834,12 @@ Accordion.prototype.initSectionHeaders = function () {
|
|
818
834
|
// Loop through section headers
|
819
835
|
nodeListForEach(this.$sections, function ($section, i) {
|
820
836
|
// Set header attributes
|
821
|
-
var header = $section.querySelector('.' + this.sectionHeaderClass);
|
822
|
-
this.
|
823
|
-
|
837
|
+
var $header = $section.querySelector('.' + this.sectionHeaderClass);
|
838
|
+
this.constructHeaderMarkup($header, i);
|
824
839
|
this.setExpanded(this.isExpanded($section), $section);
|
825
840
|
|
826
841
|
// Handle events
|
827
|
-
header.addEventListener('click', this.onSectionToggle.bind(this, $section));
|
842
|
+
$header.addEventListener('click', this.onSectionToggle.bind(this, $section));
|
828
843
|
|
829
844
|
// See if there is any state stored in sessionStorage and set the sections to
|
830
845
|
// open or closed.
|
@@ -832,51 +847,100 @@ Accordion.prototype.initSectionHeaders = function () {
|
|
832
847
|
}.bind(this));
|
833
848
|
};
|
834
849
|
|
835
|
-
|
836
|
-
Accordion.prototype.initHeaderAttributes = function ($headerWrapper, index) {
|
837
|
-
var $module = this;
|
850
|
+
Accordion.prototype.constructHeaderMarkup = function ($headerWrapper, index) {
|
838
851
|
var $span = $headerWrapper.querySelector('.' + this.sectionButtonClass);
|
839
852
|
var $heading = $headerWrapper.querySelector('.' + this.sectionHeadingClass);
|
840
853
|
var $summary = $headerWrapper.querySelector('.' + this.sectionSummaryClass);
|
841
854
|
|
842
|
-
//
|
855
|
+
// Create a button element that will replace the '.govuk-accordion__section-button' span
|
843
856
|
var $button = document.createElement('button');
|
844
857
|
$button.setAttribute('type', 'button');
|
845
|
-
$button.setAttribute('id', this.moduleId + '-heading-' + (index + 1));
|
846
858
|
$button.setAttribute('aria-controls', this.moduleId + '-content-' + (index + 1));
|
847
859
|
|
848
860
|
// Copy all attributes (https://developer.mozilla.org/en-US/docs/Web/API/Element/attributes) from $span to $button
|
849
861
|
for (var i = 0; i < $span.attributes.length; i++) {
|
850
862
|
var attr = $span.attributes.item(i);
|
851
|
-
|
863
|
+
// Add all attributes but not ID as this is being added to
|
864
|
+
// the section heading ($headingText)
|
865
|
+
if (attr.nodeName !== 'id') {
|
866
|
+
$button.setAttribute(attr.nodeName, attr.nodeValue);
|
867
|
+
}
|
852
868
|
}
|
853
869
|
|
854
|
-
|
855
|
-
|
856
|
-
|
870
|
+
// Create container for heading text so it can be styled
|
871
|
+
var $headingText = document.createElement('span');
|
872
|
+
$headingText.classList.add(this.sectionHeadingTextClass);
|
873
|
+
// Copy the span ID to the heading text to allow it to be referenced by `aria-labelledby` on the
|
874
|
+
// hidden content area without "Show this section"
|
875
|
+
$headingText.id = $span.id;
|
876
|
+
|
877
|
+
// Create an inner heading text container to limit the width of the focus state
|
878
|
+
var $headingTextFocus = document.createElement('span');
|
879
|
+
$headingTextFocus.classList.add(this.sectionHeadingTextFocusClass);
|
880
|
+
$headingText.appendChild($headingTextFocus);
|
881
|
+
// span could contain HTML elements (see https://www.w3.org/TR/2011/WD-html5-20110525/content-models.html#phrasing-content)
|
882
|
+
$headingTextFocus.innerHTML = $span.innerHTML;
|
883
|
+
|
884
|
+
// Create container for show / hide icons and text.
|
885
|
+
var $showToggle = document.createElement('span');
|
886
|
+
$showToggle.classList.add(this.sectionShowHideToggleClass);
|
887
|
+
// Tell Google not to index the 'show' text as part of the heading
|
888
|
+
// For the snippet to work with JavaScript, it must be added before adding the page element to the
|
889
|
+
// page's DOM. See https://developers.google.com/search/docs/advanced/robots/robots_meta_tag#data-nosnippet-attr
|
890
|
+
$showToggle.setAttribute('data-nosnippet', '');
|
891
|
+
// Create an inner container to limit the width of the focus state
|
892
|
+
var $showToggleFocus = document.createElement('span');
|
893
|
+
$showToggleFocus.classList.add(this.sectionShowHideToggleFocusClass);
|
894
|
+
$showToggle.appendChild($showToggleFocus);
|
895
|
+
// Create wrapper for the show / hide text. Append text after the show/hide icon
|
896
|
+
var $showToggleText = document.createElement('span');
|
897
|
+
var $icon = document.createElement('span');
|
898
|
+
$icon.classList.add(this.upChevronIconClass);
|
899
|
+
$showToggleFocus.appendChild($icon);
|
900
|
+
$showToggleText.classList.add(this.sectionShowHideTextClass);
|
901
|
+
$showToggleFocus.appendChild($showToggleText);
|
902
|
+
|
903
|
+
// Append elements to the button:
|
904
|
+
// 1. Heading text
|
905
|
+
// 2. Punctuation
|
906
|
+
// 3. (Optional: Summary line followed by punctuation)
|
907
|
+
// 4. Show / hide toggle
|
908
|
+
$button.appendChild($headingText);
|
909
|
+
$button.appendChild(this.getButtonPunctuationEl());
|
910
|
+
|
911
|
+
// If summary content exists add to DOM in correct order
|
912
|
+
if (typeof ($summary) !== 'undefined' && $summary !== null) {
|
913
|
+
// Create a new `span` element and copy the summary line content from the original `div` to the
|
914
|
+
// new `span`
|
915
|
+
// This is because the summary line text is now inside a button element, which can only contain
|
916
|
+
// phrasing content
|
917
|
+
var $summarySpan = document.createElement('span');
|
918
|
+
// Create an inner summary container to limit the width of the summary focus state
|
919
|
+
var $summarySpanFocus = document.createElement('span');
|
920
|
+
$summarySpanFocus.classList.add(this.sectionSummaryFocusClass);
|
921
|
+
$summarySpan.appendChild($summarySpanFocus);
|
922
|
+
|
923
|
+
// Get original attributes, and pass them to the replacement
|
924
|
+
for (var j = 0, l = $summary.attributes.length; j < l; ++j) {
|
925
|
+
var nodeName = $summary.attributes.item(j).nodeName;
|
926
|
+
var nodeValue = $summary.attributes.item(j).nodeValue;
|
927
|
+
$summarySpan.setAttribute(nodeName, nodeValue);
|
857
928
|
}
|
858
|
-
});
|
859
929
|
|
860
|
-
|
861
|
-
$
|
862
|
-
});
|
930
|
+
// Copy original contents of summary to the new summary span
|
931
|
+
$summarySpanFocus.innerHTML = $summary.innerHTML;
|
863
932
|
|
864
|
-
|
865
|
-
$
|
933
|
+
// Replace the original summary `div` with the new summary `span`
|
934
|
+
$summary.parentNode.replaceChild($summarySpan, $summary);
|
935
|
+
|
936
|
+
$button.appendChild($summarySpan);
|
937
|
+
$button.appendChild(this.getButtonPunctuationEl());
|
866
938
|
}
|
867
939
|
|
868
|
-
|
869
|
-
$button.innerHTML = $span.innerHTML;
|
940
|
+
$button.appendChild($showToggle);
|
870
941
|
|
871
942
|
$heading.removeChild($span);
|
872
943
|
$heading.appendChild($button);
|
873
|
-
|
874
|
-
// Add "+/-" icon
|
875
|
-
var icon = document.createElement('span');
|
876
|
-
icon.className = this.iconClass;
|
877
|
-
icon.setAttribute('aria-hidden', 'true');
|
878
|
-
|
879
|
-
$button.appendChild(icon);
|
880
944
|
};
|
881
945
|
|
882
946
|
// When section toggled, set and store state
|
@@ -889,10 +953,9 @@ Accordion.prototype.onSectionToggle = function ($section) {
|
|
889
953
|
};
|
890
954
|
|
891
955
|
// When Open/Close All toggled, set and store state
|
892
|
-
Accordion.prototype.
|
956
|
+
Accordion.prototype.onShowOrHideAllToggle = function () {
|
893
957
|
var $module = this;
|
894
958
|
var $sections = this.$sections;
|
895
|
-
|
896
959
|
var nowExpanded = !this.checkIfAllSectionsOpen();
|
897
960
|
|
898
961
|
nodeListForEach($sections, function ($section) {
|
@@ -901,23 +964,37 @@ Accordion.prototype.onOpenOrCloseAllToggle = function () {
|
|
901
964
|
$module.storeState($section);
|
902
965
|
});
|
903
966
|
|
904
|
-
$module.
|
967
|
+
$module.updateShowAllButton(nowExpanded);
|
905
968
|
};
|
906
969
|
|
907
970
|
// Set section attributes when opened/closed
|
908
971
|
Accordion.prototype.setExpanded = function (expanded, $section) {
|
972
|
+
var $icon = $section.querySelector('.' + this.upChevronIconClass);
|
973
|
+
var $showHideText = $section.querySelector('.' + this.sectionShowHideTextClass);
|
909
974
|
var $button = $section.querySelector('.' + this.sectionButtonClass);
|
975
|
+
var $newButtonText = expanded ? 'Hide' : 'Show';
|
976
|
+
|
977
|
+
// Build additional copy of "this section" for assistive technology and place inside toggle link
|
978
|
+
var $visuallyHiddenText = document.createElement('span');
|
979
|
+
$visuallyHiddenText.classList.add('govuk-visually-hidden');
|
980
|
+
$visuallyHiddenText.innerHTML = ' this section';
|
981
|
+
|
982
|
+
$showHideText.innerHTML = $newButtonText;
|
983
|
+
$showHideText.appendChild($visuallyHiddenText);
|
910
984
|
$button.setAttribute('aria-expanded', expanded);
|
911
985
|
|
986
|
+
// Swap icon, change class
|
912
987
|
if (expanded) {
|
913
988
|
$section.classList.add(this.sectionExpandedClass);
|
989
|
+
$icon.classList.remove(this.downChevronIconClass);
|
914
990
|
} else {
|
915
991
|
$section.classList.remove(this.sectionExpandedClass);
|
992
|
+
$icon.classList.add(this.downChevronIconClass);
|
916
993
|
}
|
917
994
|
|
918
|
-
// See if "
|
995
|
+
// See if "Show all sections" button text should be updated
|
919
996
|
var areAllSectionsOpen = this.checkIfAllSectionsOpen();
|
920
|
-
this.
|
997
|
+
this.updateShowAllButton(areAllSectionsOpen);
|
921
998
|
};
|
922
999
|
|
923
1000
|
// Get state of section
|
@@ -936,12 +1013,20 @@ Accordion.prototype.checkIfAllSectionsOpen = function () {
|
|
936
1013
|
return areAllSectionsOpen
|
937
1014
|
};
|
938
1015
|
|
939
|
-
// Update "
|
940
|
-
Accordion.prototype.
|
941
|
-
var
|
942
|
-
|
943
|
-
|
944
|
-
this.$
|
1016
|
+
// Update "Show all sections" button
|
1017
|
+
Accordion.prototype.updateShowAllButton = function (expanded) {
|
1018
|
+
var $showAllIcon = this.$showAllButton.querySelector('.' + this.upChevronIconClass);
|
1019
|
+
var $showAllText = this.$showAllButton.querySelector('.' + this.showAllTextClass);
|
1020
|
+
var newButtonText = expanded ? 'Hide all sections' : 'Show all sections';
|
1021
|
+
this.$showAllButton.setAttribute('aria-expanded', expanded);
|
1022
|
+
$showAllText.innerHTML = newButtonText;
|
1023
|
+
|
1024
|
+
// Swap icon, toggle class
|
1025
|
+
if (expanded) {
|
1026
|
+
$showAllIcon.classList.remove(this.downChevronIconClass);
|
1027
|
+
} else {
|
1028
|
+
$showAllIcon.classList.add(this.downChevronIconClass);
|
1029
|
+
}
|
945
1030
|
};
|
946
1031
|
|
947
1032
|
// Check for `window.sessionStorage`, and that it actually works.
|
@@ -965,7 +1050,7 @@ var helper = {
|
|
965
1050
|
// Set the state of the accordions in sessionStorage
|
966
1051
|
Accordion.prototype.storeState = function ($section) {
|
967
1052
|
if (this.browserSupportsSessionStorage) {
|
968
|
-
// We need a unique way of identifying each content in the
|
1053
|
+
// We need a unique way of identifying each content in the Accordion. Since
|
969
1054
|
// an `#id` should be unique and an `id` is required for `aria-` attributes
|
970
1055
|
// `id` can be safely used.
|
971
1056
|
var $button = $section.querySelector('.' + this.sectionButtonClass);
|
@@ -1006,6 +1091,25 @@ Accordion.prototype.setInitialState = function ($section) {
|
|
1006
1091
|
}
|
1007
1092
|
};
|
1008
1093
|
|
1094
|
+
/**
|
1095
|
+
* Create an element to improve semantics of the section button with punctuation
|
1096
|
+
* @return {object} DOM element
|
1097
|
+
*
|
1098
|
+
* Used to add pause (with a comma) for assistive technology.
|
1099
|
+
* Example: [heading]Section A ,[pause] Show this section.
|
1100
|
+
* https://accessibility.blog.gov.uk/2017/12/18/what-working-on-gov-uk-navigation-taught-us-about-accessibility/
|
1101
|
+
*
|
1102
|
+
* Adding punctuation to the button can also improve its general semantics by dividing its contents
|
1103
|
+
* into thematic chunks.
|
1104
|
+
* See https://github.com/alphagov/govuk-frontend/issues/2327#issuecomment-922957442
|
1105
|
+
*/
|
1106
|
+
Accordion.prototype.getButtonPunctuationEl = function () {
|
1107
|
+
var $punctuationEl = document.createElement('span');
|
1108
|
+
$punctuationEl.classList.add('govuk-visually-hidden', 'govuk-accordion__section-heading-divider');
|
1109
|
+
$punctuationEl.innerHTML = ', ';
|
1110
|
+
return $punctuationEl
|
1111
|
+
};
|
1112
|
+
|
1009
1113
|
return Accordion;
|
1010
1114
|
|
1011
1115
|
})));
|
@@ -158,10 +158,6 @@
|
|
158
158
|
cursor: default;
|
159
159
|
}
|
160
160
|
|
161
|
-
&:focus {
|
162
|
-
outline: none;
|
163
|
-
}
|
164
|
-
|
165
161
|
&:active {
|
166
162
|
top: 0;
|
167
163
|
box-shadow: 0 $button-shadow-size 0 $govuk-button-shadow-colour; // s0
|
@@ -270,6 +266,9 @@
|
|
270
266
|
-webkit-align-self: center;
|
271
267
|
-ms-flex-item-align: center;
|
272
268
|
align-self: center;
|
269
|
+
// Work around SVGs not inheriting color from parent in forced color mode
|
270
|
+
// (https://github.com/w3c/csswg-drafts/issues/6310)
|
271
|
+
forced-color-adjust: auto;
|
273
272
|
}
|
274
273
|
|
275
274
|
@if $govuk-use-legacy-font {
|
@@ -1,7 +1,7 @@
|
|
1
1
|
(function (global, factory) {
|
2
2
|
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
3
|
-
typeof define === 'function' && define.amd ? define('GOVUKFrontend', factory) :
|
4
|
-
(global.GOVUKFrontend = factory());
|
3
|
+
typeof define === 'function' && define.amd ? define('GOVUKFrontend.Button', factory) :
|
4
|
+
(global.GOVUKFrontend = global.GOVUKFrontend || {}, global.GOVUKFrontend.Button = factory());
|
5
5
|
}(this, (function () { 'use strict';
|
6
6
|
|
7
7
|
(function(undefined) {
|
@@ -1,7 +1,7 @@
|
|
1
1
|
(function (global, factory) {
|
2
2
|
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
3
|
-
typeof define === 'function' && define.amd ? define('GOVUKFrontend', factory) :
|
4
|
-
(global.GOVUKFrontend = factory());
|
3
|
+
typeof define === 'function' && define.amd ? define('GOVUKFrontend.CharacterCount', factory) :
|
4
|
+
(global.GOVUKFrontend = global.GOVUKFrontend || {}, global.GOVUKFrontend.CharacterCount = factory());
|
5
5
|
}(this, (function () { 'use strict';
|
6
6
|
|
7
7
|
(function(undefined) {
|
@@ -1018,7 +1018,7 @@ function CharacterCount ($module) {
|
|
1018
1018
|
this.$module = $module;
|
1019
1019
|
this.$textarea = $module.querySelector('.govuk-js-character-count');
|
1020
1020
|
if (this.$textarea) {
|
1021
|
-
this.$countMessage =
|
1021
|
+
this.$countMessage = document.getElementById(this.$textarea.id + '-info');
|
1022
1022
|
}
|
1023
1023
|
}
|
1024
1024
|
|
@@ -127,6 +127,20 @@
|
|
127
127
|
// Focused state
|
128
128
|
.govuk-checkboxes__input:focus + .govuk-checkboxes__label:before {
|
129
129
|
border-width: 4px;
|
130
|
+
|
131
|
+
// When colours are overridden, the yellow box-shadow becomes invisible
|
132
|
+
// which means the focus state is less obvious. By adding a transparent
|
133
|
+
// outline, which becomes solid (text-coloured) in that context, we ensure
|
134
|
+
// the focus remains clearly visible.
|
135
|
+
outline: $govuk-focus-width solid transparent;
|
136
|
+
outline-offset: 1px;
|
137
|
+
|
138
|
+
// When in an explicit forced-color mode, we can use the Highlight system
|
139
|
+
// color for the outline to better match focus states of native controls
|
140
|
+
@media screen and (forced-colors: active), (-ms-high-contrast: active) {
|
141
|
+
outline-color: Highlight;
|
142
|
+
}
|
143
|
+
|
130
144
|
box-shadow: 0 0 0 $govuk-focus-width $govuk-focus-colour;
|
131
145
|
}
|
132
146
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
(function (global, factory) {
|
2
2
|
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
3
|
-
typeof define === 'function' && define.amd ? define('GOVUKFrontend', factory) :
|
4
|
-
(global.GOVUKFrontend = factory());
|
3
|
+
typeof define === 'function' && define.amd ? define('GOVUKFrontend.Checkboxes', factory) :
|
4
|
+
(global.GOVUKFrontend = global.GOVUKFrontend || {}, global.GOVUKFrontend.Checkboxes = factory());
|
5
5
|
}(this, (function () { 'use strict';
|
6
6
|
|
7
7
|
(function(undefined) {
|
@@ -1056,7 +1056,7 @@ Checkboxes.prototype.init = function () {
|
|
1056
1056
|
|
1057
1057
|
// Skip checkboxes without data-aria-controls attributes, or where the
|
1058
1058
|
// target element does not exist.
|
1059
|
-
if (!target ||
|
1059
|
+
if (!target || !document.getElementById(target)) {
|
1060
1060
|
return
|
1061
1061
|
}
|
1062
1062
|
|
@@ -1100,7 +1100,7 @@ Checkboxes.prototype.syncAllConditionalReveals = function () {
|
|
1100
1100
|
* @param {HTMLInputElement} $input Checkbox input
|
1101
1101
|
*/
|
1102
1102
|
Checkboxes.prototype.syncConditionalRevealWithInputState = function ($input) {
|
1103
|
-
var $target =
|
1103
|
+
var $target = document.getElementById($input.getAttribute('aria-controls'));
|
1104
1104
|
|
1105
1105
|
if ($target && $target.classList.contains('govuk-checkboxes__conditional')) {
|
1106
1106
|
var inputIsChecked = $input.checked;
|
@@ -1123,10 +1123,9 @@ Checkboxes.prototype.unCheckAllInputsExcept = function ($input) {
|
|
1123
1123
|
var hasSameFormOwner = ($input.form === $inputWithSameName.form);
|
1124
1124
|
if (hasSameFormOwner && $inputWithSameName !== $input) {
|
1125
1125
|
$inputWithSameName.checked = false;
|
1126
|
+
this.syncConditionalRevealWithInputState($inputWithSameName);
|
1126
1127
|
}
|
1127
|
-
});
|
1128
|
-
|
1129
|
-
this.syncAllConditionalReveals();
|
1128
|
+
}.bind(this));
|
1130
1129
|
};
|
1131
1130
|
|
1132
1131
|
/**
|
@@ -1145,10 +1144,9 @@ Checkboxes.prototype.unCheckExclusiveInputs = function ($input) {
|
|
1145
1144
|
var hasSameFormOwner = ($input.form === $exclusiveInput.form);
|
1146
1145
|
if (hasSameFormOwner) {
|
1147
1146
|
$exclusiveInput.checked = false;
|
1147
|
+
this.syncConditionalRevealWithInputState($exclusiveInput);
|
1148
1148
|
}
|
1149
|
-
});
|
1150
|
-
|
1151
|
-
this.syncAllConditionalReveals();
|
1149
|
+
}.bind(this));
|
1152
1150
|
};
|
1153
1151
|
|
1154
1152
|
/**
|
@@ -1,7 +1,7 @@
|
|
1
1
|
(function (global, factory) {
|
2
2
|
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
3
|
-
typeof define === 'function' && define.amd ? define('GOVUKFrontend', factory) :
|
4
|
-
(global.GOVUKFrontend = factory());
|
3
|
+
typeof define === 'function' && define.amd ? define('GOVUKFrontend.Details', factory) :
|
4
|
+
(global.GOVUKFrontend = global.GOVUKFrontend || {}, global.GOVUKFrontend.Details = factory());
|
5
5
|
}(this, (function () { 'use strict';
|
6
6
|
|
7
7
|
(function(undefined) {
|
@@ -1,7 +1,7 @@
|
|
1
1
|
(function (global, factory) {
|
2
2
|
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
3
|
-
typeof define === 'function' && define.amd ? define('GOVUKFrontend', factory) :
|
4
|
-
(global.GOVUKFrontend = factory());
|
3
|
+
typeof define === 'function' && define.amd ? define('GOVUKFrontend.ErrorSummary', factory) :
|
4
|
+
(global.GOVUKFrontend = global.GOVUKFrontend || {}, global.GOVUKFrontend.ErrorSummary = factory());
|
5
5
|
}(this, (function () { 'use strict';
|
6
6
|
|
7
7
|
(function(undefined) {
|
@@ -111,6 +111,9 @@
|
|
111
111
|
margin-bottom: govuk-spacing(3);
|
112
112
|
}
|
113
113
|
vertical-align: top;
|
114
|
+
// Work around SVGs not inheriting color from parent in forced color mode
|
115
|
+
// (https://github.com/w3c/csswg-drafts/issues/6310)
|
116
|
+
forced-color-adjust: auto;
|
114
117
|
}
|
115
118
|
|
116
119
|
.govuk-footer__licence-description {
|
@@ -149,8 +152,9 @@
|
|
149
152
|
}
|
150
153
|
|
151
154
|
.govuk-footer__heading {
|
152
|
-
|
155
|
+
margin-bottom: govuk-spacing(6);
|
153
156
|
padding-bottom: govuk-spacing(4);
|
157
|
+
|
154
158
|
@include govuk-media-query ($until: tablet) {
|
155
159
|
padding-bottom: govuk-spacing(2);
|
156
160
|
}
|
@@ -158,50 +162,15 @@
|
|
158
162
|
}
|
159
163
|
|
160
164
|
.govuk-footer__navigation {
|
161
|
-
|
162
|
-
display: -webkit-flex;
|
163
|
-
display: -ms-flexbox;
|
164
|
-
display: flex; // Support: Flexbox
|
165
|
+
@include govuk-clearfix;
|
165
166
|
margin-right: -$govuk-gutter-half;
|
166
167
|
margin-left: -$govuk-gutter-half;
|
167
|
-
-webkit-flex-wrap: wrap;
|
168
|
-
-ms-flex-wrap: wrap;
|
169
|
-
flex-wrap: wrap; // Support: Flexbox
|
170
168
|
}
|
171
169
|
|
172
170
|
.govuk-footer__section {
|
173
171
|
display: inline-block;
|
174
|
-
margin-right: $govuk-gutter-half;
|
175
172
|
margin-bottom: $govuk-gutter;
|
176
|
-
margin-left: $govuk-gutter-half;
|
177
173
|
vertical-align: top;
|
178
|
-
// Ensure columns take up equal width (typically one-half:one-half)
|
179
|
-
-webkit-box-flex: 1;
|
180
|
-
-webkit-flex-grow: 1;
|
181
|
-
-ms-flex-positive: 1;
|
182
|
-
flex-grow: 1; // Support: Flexbox
|
183
|
-
-webkit-flex-shrink: 1;
|
184
|
-
-ms-flex-negative: 1;
|
185
|
-
flex-shrink: 1; // Support: Flexbox
|
186
|
-
@include govuk-media-query ($until: desktop) {
|
187
|
-
// Make sure columns do not drop below 200px in width
|
188
|
-
// Will typically result in wrapping, and end up in a single column on smaller screens.
|
189
|
-
-webkit-flex-basis: 200px;
|
190
|
-
-ms-flex-preferred-size: 200px;
|
191
|
-
flex-basis: 200px; // Support: Flexbox
|
192
|
-
}
|
193
|
-
}
|
194
|
-
|
195
|
-
// If there are only two sections, set the layout to be two-third:one-third on desktop
|
196
|
-
@include govuk-media-query ($from: desktop) {
|
197
|
-
// We match the first section with `:first-child`.
|
198
|
-
// To ensure the section is one of two, we can count backwards using `:nth-last-child(2)`.
|
199
|
-
.govuk-footer__section:first-child:nth-last-child(2) {
|
200
|
-
-webkit-box-flex: 2;
|
201
|
-
-webkit-flex-grow: 2;
|
202
|
-
-ms-flex-positive: 2;
|
203
|
-
flex-grow: 2; // Support: Flexbox
|
204
|
-
}
|
205
174
|
}
|
206
175
|
|
207
176
|
.govuk-footer__list {
|
@@ -207,8 +207,13 @@
|
|
207
207
|
}
|
208
208
|
|
209
209
|
.govuk-header__navigation {
|
210
|
-
@include govuk-
|
211
|
-
|
210
|
+
@include govuk-media-query ($from: desktop) {
|
211
|
+
margin-bottom: govuk-spacing(2);
|
212
|
+
}
|
213
|
+
}
|
214
|
+
|
215
|
+
.govuk-header__navigation-list {
|
216
|
+
// Reset user-agent default list styles
|
212
217
|
margin: 0;
|
213
218
|
padding: 0;
|
214
219
|
list-style: none;
|
@@ -222,14 +227,14 @@
|
|
222
227
|
}
|
223
228
|
}
|
224
229
|
|
225
|
-
.govuk-header__navigation {
|
230
|
+
.govuk-header__navigation-list {
|
226
231
|
display: none;
|
227
232
|
@include govuk-media-query ($from: desktop) {
|
228
233
|
display: block;
|
229
234
|
}
|
230
235
|
}
|
231
236
|
|
232
|
-
.govuk-header__navigation--open {
|
237
|
+
.govuk-header__navigation-list--open {
|
233
238
|
display: block;
|
234
239
|
}
|
235
240
|
}
|
@@ -281,6 +286,7 @@
|
|
281
286
|
|
282
287
|
.govuk-header__navigation-item:last-child {
|
283
288
|
margin-right: 0;
|
289
|
+
border-bottom: 0;
|
284
290
|
}
|
285
291
|
|
286
292
|
@include govuk-media-query($media-type: print) {
|