govuk_frontend_toolkit 4.17.0 → 4.18.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 814dd64f724ed55761b47722aac9ba2a35904b99
4
- data.tar.gz: c06eca3d6fee3ac3ef3bd036ddd2183e23854037
3
+ metadata.gz: 1d26d1ef89d6ab3d92647088449fddf4cf9a2093
4
+ data.tar.gz: 30f1b2893d74986e0ecb3ec56ce9f33539a58a62
5
5
  SHA512:
6
- metadata.gz: e858e46f18e4f819a793f64ef6b490153a906d4ce39903be37a740aa72cbecf9831bfee32819258d88c65ec9408687623d257bb4bd72bf30e9775428858da5be
7
- data.tar.gz: d2f9dff826f282602071b32f40873fd642e8fb72513e862d61ae82863c05ffbbfbf650969233d35bcccf6cc4be9640a87f35a40b0c6977d1c5ca85428e96de41
6
+ metadata.gz: fe26e2f049d3b8bf9e205cdfb1e7b9629d587c5a1cc3cb455ff8b1c91c47a3113c4b06a1422e267fb04989eee5cc93d83905b00eda9f5ba0ea3279eb0e6ed2c0
7
+ data.tar.gz: 3e8616187fce2571b99ed181412bf9743c0bf60c9402232970b6c3bc2b9db2d1736821692bc6da0aa1aec142c3d8d9ae93fc6138f2dbdc7d0b2d114d4dff98ec
@@ -1,3 +1,7 @@
1
+ # 4.18.0
2
+
3
+ - Add GOVUK.ShowHideContent JavaScript to support showing and hiding content, toggled by radio buttons and checkboxes ([PR #315](https://github.com/alphagov/govuk_frontend_toolkit/pull/315)).
4
+
1
5
  # 4.17.0
2
6
 
3
7
  - SelectionButtons will add a class to the label with the type of the child input ([PR #317](https://github.com/alphagov/govuk_frontend_toolkit/pull/317))
data/app/assets/README.md CHANGED
@@ -142,6 +142,7 @@ In production:
142
142
  * [Stick at top when scrolling](/docs/javascript.md#stick-at-top-when-scrolling)
143
143
  * [Selection buttons](/docs/javascript.md#selection-buttons)
144
144
  * [Shim links with button role](/docs/javascript.md#shim-links-with-button-role)
145
+ * [Show/Hide content](/docs/javascript.md#showhide-content)
145
146
  * [Analytics](/docs/analytics.md)
146
147
  * [Create an analytics tracker](/docs/analytics.md#create-an-analytics-tracker)
147
148
  * [Virtual pageviews](/docs/analytics.md#virtual-pageviews)
@@ -1 +1 @@
1
- 4.17.0
1
+ 4.18.0
@@ -431,3 +431,41 @@ GOVUK.shimLinksWithButtonRole.init({
431
431
  keycodes: [32, 114]
432
432
  });
433
433
  ```
434
+
435
+ ## Show/Hide content
436
+
437
+ Script to support show/hide content, toggled by radio buttons and checkboxes. This allows for progressive disclosure of question and answer forms based on selected values:
438
+
439
+ <label class="block-label" data-target="show-me">
440
+ <input type="radio" name="enabled" value="yes" /> Yes
441
+ </label>
442
+
443
+ <label class="block-label">
444
+ <input type="radio" name="enabled" value="no" /> No
445
+ </label>
446
+
447
+ <div id="show-me" class="panel js-hidden">
448
+ <p>Show/Hide content to be toggled</p>
449
+ </div>
450
+
451
+ When the input's `checked` attribute is set, the show/hide content's `.js-hidden` class is removed and ARIA attributes are added to enable it. Note the sample `show-me` id attribute used to link the label to show/hide content.
452
+
453
+ ### Usage
454
+
455
+ #### GOVUK.ShowHideContent
456
+
457
+ To apply this behaviour to elements with the above HTML pattern, call the `GOVUK.ShowHideContent` constructor:
458
+
459
+ ```
460
+ var showHideContent = new GOVUK.ShowHideContent();
461
+ showHideContent.init();
462
+ ```
463
+
464
+ This will bind two event handlers to $(document.body), one for radio inputs and one for checkboxes. By listening for events bubbling up to the `body` tag, additional show/hide content added to the page will still be picked up after `.init()` is called.
465
+
466
+ Alternatively, pass in your own selector. In the example below, event handlers are bound to the form instead.
467
+
468
+ ```
469
+ var showHideContent = new GOVUK.ShowHideContent();
470
+ showHideContent.init($('form.example'));
471
+ ```
@@ -0,0 +1,171 @@
1
+ ;(function (global) {
2
+ 'use strict'
3
+
4
+ var $ = global.jQuery
5
+ var GOVUK = global.GOVUK || {}
6
+
7
+ function ShowHideContent () {
8
+ var self = this
9
+
10
+ // Radio and Checkbox selectors
11
+ var selectors = {
12
+ namespace: 'ShowHideContent',
13
+ radio: '.block-label[data-target] input[type="radio"]',
14
+ checkbox: '.block-label[data-target] input[type="checkbox"]'
15
+ }
16
+
17
+ // Escape name attribute for use in DOM selector
18
+ function escapeElementName (str) {
19
+ var result = str.replace('[', '\\[').replace(']', '\\]')
20
+ return result
21
+ }
22
+
23
+ // Adds ARIA attributes to control + associated content
24
+ function initToggledContent () {
25
+ var $control = $(this)
26
+ var $content = getToggledContent($control)
27
+
28
+ // Set aria-controls and defaults
29
+ if ($content.length) {
30
+ $control.attr('aria-controls', $content.attr('id'))
31
+ $control.attr('aria-expanded', 'false')
32
+ $content.attr('aria-hidden', 'true')
33
+ }
34
+ }
35
+
36
+ // Return toggled content for control
37
+ function getToggledContent ($control) {
38
+ var id = $control.attr('aria-controls')
39
+
40
+ // ARIA attributes aren't set before init
41
+ if (!id) {
42
+ id = $control.closest('label').data('target')
43
+ }
44
+
45
+ // Find show/hide content by id
46
+ return $('#' + id)
47
+ }
48
+
49
+ // Show toggled content for control
50
+ function showToggledContent ($control, $content) {
51
+ // Show content
52
+ if ($content.hasClass('js-hidden')) {
53
+ $content.removeClass('js-hidden')
54
+ $content.attr('aria-hidden', 'false')
55
+
56
+ // If the controlling input, update aria-expanded
57
+ if ($control.attr('aria-controls')) {
58
+ $control.attr('aria-expanded', 'true')
59
+ }
60
+ }
61
+ }
62
+
63
+ // Hide toggled content for control
64
+ function hideToggledContent ($control, $content) {
65
+ $content = $content || getToggledContent($control)
66
+
67
+ // Hide content
68
+ if (!$content.hasClass('js-hidden')) {
69
+ $content.addClass('js-hidden')
70
+ $content.attr('aria-hidden', 'true')
71
+
72
+ // If the controlling input, update aria-expanded
73
+ if ($control.attr('aria-controls')) {
74
+ $control.attr('aria-expanded', 'false')
75
+ }
76
+ }
77
+ }
78
+
79
+ // Handle radio show/hide
80
+ function handleRadioContent ($control, $content) {
81
+ // All radios in this group which control content
82
+ var selector = selectors.radio + '[name=' + escapeElementName($control.attr('name')) + '][aria-controls]'
83
+ var $radios = $control.closest('form').find(selector)
84
+
85
+ // Hide content for radios in group
86
+ $radios.each(function () {
87
+ hideToggledContent($(this))
88
+ })
89
+
90
+ // Select content for this control
91
+ if ($control.is('[aria-controls]')) {
92
+ showToggledContent($control, $content)
93
+ }
94
+ }
95
+
96
+ // Handle checkbox show/hide
97
+ function handleCheckboxContent ($control, $content) {
98
+ // Show checkbox content
99
+ if ($control.is(':checked')) {
100
+ showToggledContent($control, $content)
101
+ } else { // Hide checkbox content
102
+ hideToggledContent($control, $content)
103
+ }
104
+ }
105
+
106
+ // Set up event handlers etc
107
+ function init ($container, elementSelector, eventSelectors, handler) {
108
+ $container = $container || $(document.body)
109
+
110
+ // Handle control clicks
111
+ function deferred () {
112
+ var $control = $(this)
113
+ handler($control, getToggledContent($control))
114
+ }
115
+
116
+ // Prepare ARIA attributes
117
+ var $controls = $(elementSelector)
118
+ $controls.each(initToggledContent)
119
+
120
+ // Handle events
121
+ $.each(eventSelectors, function (idx, eventSelector) {
122
+ $container.on('click.' + selectors.namespace, eventSelector, deferred)
123
+ })
124
+
125
+ // Any already :checked on init?
126
+ if ($controls.is(':checked')) {
127
+ $controls.filter(':checked').each(deferred)
128
+ }
129
+ }
130
+
131
+ // Get event selectors for all radio groups
132
+ function getEventSelectorsForRadioGroups () {
133
+ var radioGroups = []
134
+
135
+ // Build an array of radio group selectors
136
+ return $(selectors.radio).map(function () {
137
+ var groupName = $(this).attr('name')
138
+
139
+ if ($.inArray(groupName, radioGroups) === -1) {
140
+ radioGroups.push(groupName)
141
+ return 'input[type="radio"][name="' + $(this).attr('name') + '"]'
142
+ }
143
+ return null
144
+ })
145
+ }
146
+
147
+ // Set up radio show/hide content for container
148
+ self.showHideRadioToggledContent = function ($container) {
149
+ init($container, selectors.radio, getEventSelectorsForRadioGroups(), handleRadioContent)
150
+ }
151
+
152
+ // Set up checkbox show/hide content for container
153
+ self.showHideCheckboxToggledContent = function ($container) {
154
+ init($container, selectors.checkbox, [selectors.checkbox], handleCheckboxContent)
155
+ }
156
+
157
+ // Remove event handlers
158
+ self.destroy = function ($container) {
159
+ $container = $container || $(document.body)
160
+ $container.off('.' + selectors.namespace)
161
+ }
162
+ }
163
+
164
+ ShowHideContent.prototype.init = function ($container) {
165
+ this.showHideRadioToggledContent($container)
166
+ this.showHideCheckboxToggledContent($container)
167
+ }
168
+
169
+ GOVUK.ShowHideContent = ShowHideContent
170
+ global.GOVUK = GOVUK
171
+ })(window)
@@ -1,12 +1,13 @@
1
1
  // Paths are relative to the /spec/support folder
2
2
  var manifest = {
3
- support : [
3
+ support: [
4
4
  '../../node_modules/jquery/dist/jquery.js',
5
5
  '../../javascripts/govuk/modules.js',
6
6
  '../../javascripts/govuk/modules/auto-track-event.js',
7
7
  '../../javascripts/govuk/multivariate-test.js',
8
8
  '../../javascripts/govuk/primary-links.js',
9
9
  '../../javascripts/govuk/shim-links-with-button-role.js',
10
+ '../../javascripts/govuk/show-hide-content.js',
10
11
  '../../javascripts/govuk/stick-at-top-when-scrolling.js',
11
12
  '../../javascripts/govuk/stop-scrolling-at-footer.js',
12
13
  '../../javascripts/govuk/selection-buttons.js',
@@ -17,12 +18,13 @@ var manifest = {
17
18
  '../../javascripts/govuk/analytics/download-link-tracker.js',
18
19
  '../../javascripts/govuk/analytics/mailto-link-tracker.js'
19
20
  ],
20
- test : [
21
+ test: [
21
22
  '../unit/modules.spec.js',
22
23
  '../unit/Modules/auto-track-event.spec.js',
23
24
  '../unit/multivariate-test.spec.js',
24
25
  '../unit/primary-links.spec.js',
25
26
  '../unit/shim-links-with-button-role.spec.js',
27
+ '../unit/show-hide-content.spec.js',
26
28
  '../unit/stick-at-top-when-scrolling.spec.js',
27
29
  '../unit/selection-button.spec.js',
28
30
  '../unit/analytics/google-analytics-universal-tracker.spec.js',
@@ -32,4 +34,4 @@ var manifest = {
32
34
  '../unit/analytics/download-link-tracker.spec.js',
33
35
  '../unit/analytics/mailto-link-tracker.spec.js'
34
36
  ]
35
- };
37
+ }
@@ -3,16 +3,16 @@
3
3
  <head>
4
4
  <title>Jasmine Test Runner</title>
5
5
 
6
- <link rel="stylesheet" type="text/css" href="../../node_modules/jasmine-core/lib/jasmine-core/jasmine.css">
6
+ <link rel="stylesheet" type="text/css" href="../../node_modules/grunt-contrib-jasmine/node_modules/jasmine-core/lib/jasmine-core/jasmine.css">
7
7
  <style>
8
8
  #wrapper { display: none; }
9
9
  </style>
10
10
 
11
11
  <!-- JASMINE FILES -->
12
- <script type="text/javascript" src="../../node_modules/jasmine-core/lib/jasmine-core/jasmine.js"></script>
13
- <script type="text/javascript" src="../../node_modules/jasmine-core/lib/jasmine-core/jasmine-html.js"></script>
12
+ <script type="text/javascript" src="../../node_modules/grunt-contrib-jasmine/node_modules/jasmine-core/lib/jasmine-core/jasmine.js"></script>
13
+ <script type="text/javascript" src="../../node_modules/grunt-contrib-jasmine/node_modules/jasmine-core/lib/jasmine-core/jasmine-html.js"></script>
14
14
 
15
- <script type="text/javascript" src="../../node_modules/jasmine-core/lib/jasmine-core/boot.js"></script>
15
+ <script type="text/javascript" src="../../node_modules/grunt-contrib-jasmine/node_modules/jasmine-core/lib/jasmine-core/boot.js"></script>
16
16
  <script type="text/javascript" src="./load.js"></script>
17
17
  </head>
18
18
  <body>
@@ -0,0 +1,245 @@
1
+ describe('show-hide-content', function () {
2
+ 'use strict'
3
+
4
+ beforeEach(function () {
5
+
6
+ // Sample markup
7
+ this.$content = $(
8
+
9
+ // Radio buttons (yes/no)
10
+ '<form>' +
11
+ '<label class="block-label" data-target="show-hide-radios">' +
12
+ '<input type="radio" name="single" value="no">' +
13
+ 'Yes' +
14
+ '</label>' +
15
+ '<label class="block-label">' +
16
+ '<input type="radio" name="single" value="yes">' +
17
+ 'No' +
18
+ '</label>' +
19
+ '<div id="show-hide-radios" class="panel js-hidden" />' +
20
+ '</form>' +
21
+
22
+ // Checkboxes (multiple values)
23
+ '<form>' +
24
+ '<label class="block-label" data-target="show-hide-checkboxes">' +
25
+ '<input type="checkbox" name="multiple[option1]">' +
26
+ 'Option 1' +
27
+ '</label>' +
28
+ '<label class="block-label">' +
29
+ '<input type="checkbox" name="multiple[option2]">' +
30
+ 'Option 2' +
31
+ '</label>' +
32
+ '<label class="block-label">' +
33
+ '<input type="checkbox" name="multiple[option3]">' +
34
+ 'Option 3' +
35
+ '</label>' +
36
+ '<div id="show-hide-checkboxes" class="panel js-hidden" />' +
37
+ '</form>'
38
+ )
39
+
40
+ // Find radios/checkboxes
41
+ var $radios = this.$content.find('input[type=radio]')
42
+ var $checkboxes = this.$content.find('input[type=checkbox]')
43
+
44
+ // Two radios
45
+ this.$radio1 = $radios.eq(0)
46
+ this.$radio2 = $radios.eq(1)
47
+
48
+ // Three checkboxes
49
+ this.$checkbox1 = $checkboxes.eq(0)
50
+ this.$checkbox2 = $checkboxes.eq(1)
51
+ this.$checkbox3 = $checkboxes.eq(2)
52
+
53
+ // Add to page
54
+ $(document.body).append(this.$content)
55
+
56
+ // Show/Hide content
57
+ this.$radioShowHide = $('#show-hide-radios')
58
+ this.$checkboxShowHide = $('#show-hide-checkboxes')
59
+
60
+ // Add show/hide content support
61
+ this.showHideContent = new GOVUK.ShowHideContent()
62
+ this.showHideContent.init()
63
+ })
64
+
65
+ afterEach(function () {
66
+ if (this.showHideContent) {
67
+ this.showHideContent.destroy()
68
+ }
69
+
70
+ this.$content.remove()
71
+ })
72
+
73
+ describe('when this.showHideContent = new GOVUK.ShowHideContent() is called', function () {
74
+ it('should add the aria attributes to inputs with show/hide content', function () {
75
+ expect(this.$radio1.attr('aria-expanded')).toBe('false')
76
+ expect(this.$radio1.attr('aria-controls')).toBe('show-hide-radios')
77
+ })
78
+
79
+ it('should add the aria attributes to show/hide content', function () {
80
+ expect(this.$radioShowHide.attr('aria-hidden')).toBe('true')
81
+ expect(this.$radioShowHide.hasClass('js-hidden')).toEqual(true)
82
+ })
83
+
84
+ it('should hide the show/hide content visually', function () {
85
+ expect(this.$radioShowHide.hasClass('js-hidden')).toEqual(true)
86
+ })
87
+
88
+ it('should do nothing if no radios are checked', function () {
89
+ expect(this.$radio1.attr('aria-expanded')).toBe('false')
90
+ expect(this.$radio2.attr('aria-expanded')).toBe(undefined)
91
+ })
92
+
93
+ it('should do nothing if no checkboxes are checked', function () {
94
+ expect(this.$radio1.attr('aria-expanded')).toBe('false')
95
+ expect(this.$radio2.attr('aria-expanded')).toBe(undefined)
96
+ })
97
+
98
+ describe('with non-default markup', function () {
99
+ beforeEach(function () {
100
+ this.showHideContent.destroy()
101
+ })
102
+
103
+ it('should do nothing if a radio without show/hide content is checked', function () {
104
+ this.$radio2.prop('checked', true)
105
+
106
+ // Defaults changed, initialise again
107
+ this.showHideContent = new GOVUK.ShowHideContent().init()
108
+ expect(this.$radio1.attr('aria-expanded')).toBe('false')
109
+ expect(this.$radioShowHide.attr('aria-hidden')).toBe('true')
110
+ expect(this.$radioShowHide.hasClass('js-hidden')).toEqual(true)
111
+ })
112
+
113
+ it('should do nothing if a checkbox without show/hide content is checked', function () {
114
+ this.$checkbox2.prop('checked', true)
115
+
116
+ // Defaults changed, initialise again
117
+ this.showHideContent = new GOVUK.ShowHideContent().init()
118
+ expect(this.$checkbox1.attr('aria-expanded')).toBe('false')
119
+ expect(this.$checkboxShowHide.attr('aria-hidden')).toBe('true')
120
+ expect(this.$checkboxShowHide.hasClass('js-hidden')).toEqual(true)
121
+ })
122
+
123
+ it('should do nothing if checkboxes without show/hide content is checked', function () {
124
+ this.$checkbox2.prop('checked', true)
125
+ this.$checkbox3.prop('checked', true)
126
+
127
+ // Defaults changed, initialise again
128
+ this.showHideContent = new GOVUK.ShowHideContent().init()
129
+ expect(this.$checkbox1.attr('aria-expanded')).toBe('false')
130
+ expect(this.$checkboxShowHide.attr('aria-hidden')).toBe('true')
131
+ expect(this.$checkboxShowHide.hasClass('js-hidden')).toEqual(true)
132
+ })
133
+
134
+ it('should make the show/hide content visible if its radio is checked', function () {
135
+ this.$radio1.prop('checked', true)
136
+
137
+ // Defaults changed, initialise again
138
+ this.showHideContent = new GOVUK.ShowHideContent().init()
139
+ expect(this.$radio1.attr('aria-expanded')).toBe('true')
140
+ expect(this.$radioShowHide.attr('aria-hidden')).toBe('false')
141
+ expect(this.$radioShowHide.hasClass('js-hidden')).toEqual(false)
142
+ })
143
+
144
+ it('should make the show/hide content visible if its checkbox is checked', function () {
145
+ this.$checkbox1.prop('checked', true)
146
+
147
+ // Defaults changed, initialise again
148
+ this.showHideContent = new GOVUK.ShowHideContent().init()
149
+ expect(this.$checkbox1.attr('aria-expanded')).toBe('true')
150
+ expect(this.$checkboxShowHide.attr('aria-hidden')).toBe('false')
151
+ expect(this.$checkboxShowHide.hasClass('js-hidden')).toEqual(false)
152
+ })
153
+ })
154
+
155
+ describe('and a show/hide radio receives a click', function () {
156
+ it('should make the show/hide content visible', function () {
157
+ this.$radio1.click()
158
+ expect(this.$radioShowHide.hasClass('js-hidden')).toEqual(false)
159
+ })
160
+
161
+ it('should add the aria attributes to show/hide content', function () {
162
+ this.$radio1.click()
163
+ expect(this.$radio1.attr('aria-expanded')).toBe('true')
164
+ expect(this.$radioShowHide.attr('aria-hidden')).toBe('false')
165
+ expect(this.$radioShowHide.hasClass('js-hidden')).toEqual(false)
166
+ })
167
+ })
168
+
169
+ describe('and a show/hide checkbox receives a click', function () {
170
+ it('should make the show/hide content visible', function () {
171
+ this.$checkbox1.click()
172
+ expect(this.$checkboxShowHide.hasClass('js-hidden')).toEqual(false)
173
+ })
174
+
175
+ it('should add the aria attributes to show/hide content', function () {
176
+ this.$checkbox1.click()
177
+ expect(this.$checkbox1.attr('aria-expanded')).toBe('true')
178
+ expect(this.$checkboxShowHide.attr('aria-hidden')).toBe('false')
179
+ expect(this.$checkboxShowHide.hasClass('js-hidden')).toEqual(false)
180
+ })
181
+ })
182
+
183
+ describe('and a show/hide radio receives a click, but another group radio is clicked afterwards', function () {
184
+ it('should make the show/hide content hidden', function () {
185
+ this.$radio1.click()
186
+ this.$radio2.click()
187
+ expect(this.$radioShowHide.hasClass('js-hidden')).toEqual(true)
188
+ })
189
+
190
+ it('should add the aria attributes to show/hide content', function () {
191
+ this.$radio1.click()
192
+ this.$radio2.click()
193
+ expect(this.$radio1.attr('aria-expanded')).toBe('false')
194
+ expect(this.$radioShowHide.attr('aria-hidden')).toBe('true')
195
+ })
196
+ })
197
+
198
+ describe('and a show/hide checkbox receives a click, but another checkbox is clicked afterwards', function () {
199
+ it('should keep the show/hide content visible', function () {
200
+ this.$checkbox1.click()
201
+ this.$checkbox2.click()
202
+ expect(this.$checkboxShowHide.hasClass('js-hidden')).toEqual(false)
203
+ })
204
+
205
+ it('should keep the aria attributes to show/hide content', function () {
206
+ this.$checkbox1.click()
207
+ this.$checkbox2.click()
208
+ expect(this.$checkbox1.attr('aria-expanded')).toBe('true')
209
+ expect(this.$checkboxShowHide.attr('aria-hidden')).toBe('false')
210
+ })
211
+ })
212
+ })
213
+
214
+ describe('before this.showHideContent.destroy() is called', function () {
215
+ it('document.body should have show/hide event handlers', function () {
216
+ var events = $._data(document.body, 'events')
217
+ expect(events && events.click).toContain(jasmine.objectContaining({
218
+ namespace: 'ShowHideContent',
219
+ selector: 'input[type="radio"][name="single"]'
220
+ }))
221
+ expect(events && events.click).toContain(jasmine.objectContaining({
222
+ namespace: 'ShowHideContent',
223
+ selector: '.block-label[data-target] input[type="checkbox"]'
224
+ }))
225
+ })
226
+ })
227
+
228
+ describe('when this.showHideContent.destroy() is called', function () {
229
+ beforeEach(function () {
230
+ this.showHideContent.destroy()
231
+ })
232
+
233
+ it('should have no show/hide event handlers', function () {
234
+ var events = $._data(document.body, 'events')
235
+ expect(events && events.click).not.toContain(jasmine.objectContaining({
236
+ namespace: 'ShowHideContent',
237
+ selector: 'input[type="radio"][name="single"]'
238
+ }))
239
+ expect(events && events.click).not.toContain(jasmine.objectContaining({
240
+ namespace: 'ShowHideContent',
241
+ selector: '.block-label[data-target] input[type="checkbox"]'
242
+ }))
243
+ })
244
+ })
245
+ })
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: govuk_frontend_toolkit
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.17.0
4
+ version: 4.18.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Government Digital Service
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-09-01 00:00:00.000000000 Z
11
+ date: 2016-09-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -241,6 +241,7 @@ files:
241
241
  - app/assets/javascripts/govuk/primary-links.js
242
242
  - app/assets/javascripts/govuk/selection-buttons.js
243
243
  - app/assets/javascripts/govuk/shim-links-with-button-role.js
244
+ - app/assets/javascripts/govuk/show-hide-content.js
244
245
  - app/assets/javascripts/govuk/stick-at-top-when-scrolling.js
245
246
  - app/assets/javascripts/govuk/stop-scrolling-at-footer.js
246
247
  - app/assets/javascripts/govuk_toolkit.js
@@ -266,6 +267,7 @@ files:
266
267
  - app/assets/spec/unit/primary-links.spec.js
267
268
  - app/assets/spec/unit/selection-button.spec.js
268
269
  - app/assets/spec/unit/shim-links-with-button-role.spec.js
270
+ - app/assets/spec/unit/show-hide-content.spec.js
269
271
  - app/assets/spec/unit/stick-at-top-when-scrolling.spec.js
270
272
  - app/assets/stylesheets/.gitkeep
271
273
  - app/assets/stylesheets/_colours.scss