govuk_tech_docs 1.8.3 → 1.9.0.pre.gfe
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.gitignore +1 -0
- data/.nvmrc +1 -0
- data/.travis.yml +2 -0
- data/CHANGELOG.md +4 -0
- data/README.md +6 -0
- data/Rakefile +1 -0
- data/example/source/index.html.md.erb +2 -0
- data/govuk_tech_docs.gemspec +3 -3
- data/lib/assets/javascripts/_analytics.js +26 -26
- data/lib/assets/javascripts/_govuk/modules.js +31 -32
- data/lib/assets/javascripts/_modules/anchored-headings.js +14 -14
- data/lib/assets/javascripts/_modules/collapsible-navigation.js +54 -65
- data/lib/assets/javascripts/_modules/in-page-navigation.js +61 -61
- data/lib/assets/javascripts/_modules/navigation.js +20 -20
- data/lib/assets/javascripts/_modules/page-expiry.js +11 -11
- data/lib/assets/javascripts/_modules/search.js +144 -149
- data/lib/assets/javascripts/_modules/table-of-contents.js +52 -60
- data/lib/assets/javascripts/_start-modules.js +3 -4
- data/lib/assets/javascripts/govuk_tech_docs.js +3 -3
- data/lib/assets/stylesheets/_core.scss +0 -2
- data/lib/assets/stylesheets/_govuk_tech_docs.scss +8 -0
- data/lib/govuk_tech_docs.rb +0 -1
- data/lib/govuk_tech_docs/version.rb +1 -1
- data/lib/source/layouts/_header.erb +1 -1
- data/package-lock.json +1814 -0
- data/package.json +37 -0
- metadata +8 -7
- data/lib/assets/stylesheets/modules/_phase-banner.scss +0 -22
- data/lib/assets/stylesheets/modules/_warning-text.scss +0 -73
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b15917404d723a9e26821b9631a06b181a051265
|
4
|
+
data.tar.gz: ff5c490cfde2dbde881f4a6d8dc678de7e81e536
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7a7e6cdda4975aa034ac877c90a0ab8efdd52efcf68d4126d2fd7310d24952095cd58ed70b0b9d5cb45c10510a0baea28e01dfaa272d78dc16b36eb9f849cb52
|
7
|
+
data.tar.gz: f551baaafad28fda969b023d430e6694d8a068513a7ebfe7a4f043baa776865945df144feef0c03873c95c2861eea9f8872d3e6544a7e9e4cc113c2fa9ea0a3c
|
data/.gitignore
CHANGED
data/.nvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
10.16.0
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## Unreleased
|
4
|
+
|
5
|
+
This release adds [GOV.UK Frontend](https://github.com/alphagov/govuk-frontend) (part of the [GOV.UK Design System](https://design-system.service.gov.uk)). Converts the "phase tag" (the alpha/beta thing next to the logo) to use a GOV.UK Frontend component. Also adds [Standard JS](https://standardjs.com) to the code base to lint all Javascript.
|
6
|
+
|
3
7
|
## 1.8.3
|
4
8
|
|
5
9
|
Fixes bug where search results disappear when opening results in a new tab, making it difficult to open several results in a batch (PR #86).
|
data/README.md
CHANGED
@@ -15,6 +15,12 @@ Everybody who uses this project is encouraged to contribute.
|
|
15
15
|
|
16
16
|
👉 [See CONTRIBUTING.md](CONTRIBUTING.md) for guidance on making changes.
|
17
17
|
|
18
|
+
## GOV.UK frontend
|
19
|
+
|
20
|
+
This gem uses [GOV.UK Frontend](https://github.com/alphagov/govuk-frontend), part of the [GOV.UK Design System](https://design-system.service.gov.uk/).
|
21
|
+
|
22
|
+
We use `npm` to download the govuk-frontend package. To update to a new version, change the version in [package.json](blob/master/package.json) and run `npm update`.
|
23
|
+
|
18
24
|
## Developing locally
|
19
25
|
|
20
26
|
There are 2 ways to develop with this gem. You can see your changes on either:
|
data/Rakefile
CHANGED
@@ -17,3 +17,5 @@ To change the title of the page or include additional files you'll need to edit
|
|
17
17
|
If you want slightly more control, you can always use <strong>HTML</strong>.
|
18
18
|
|
19
19
|
For more detail and troubleshooting, take a look at the `README.md` file in the root of this project.
|
20
|
+
|
21
|
+
<%= warning_text "Look out! A warning!" %>
|
data/govuk_tech_docs.gemspec
CHANGED
@@ -14,9 +14,9 @@ Gem::Specification.new do |spec|
|
|
14
14
|
spec.homepage = "https://github.com/alphagov/tech-docs-gem"
|
15
15
|
spec.license = "MIT"
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
17
|
+
files_in_git = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
+
spec.files = files_in_git + ["node_modules/govuk-frontend"]
|
19
|
+
|
20
20
|
spec.bindir = "exe"
|
21
21
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
22
|
spec.require_paths = ["lib"]
|
@@ -1,8 +1,8 @@
|
|
1
|
-
(function($) {
|
2
|
-
function trackLinkClick(action, $element) {
|
3
|
-
var linkText = $.trim($element.text())
|
4
|
-
var linkURL = $element.attr('href')
|
5
|
-
var label = linkText + '|' + linkURL
|
1
|
+
(function ($) {
|
2
|
+
function trackLinkClick (action, $element) {
|
3
|
+
var linkText = $.trim($element.text())
|
4
|
+
var linkURL = $element.attr('href')
|
5
|
+
var label = linkText + '|' + linkURL
|
6
6
|
|
7
7
|
ga(
|
8
8
|
'send',
|
@@ -10,38 +10,38 @@
|
|
10
10
|
'SM Technical Documentation', // Event Category
|
11
11
|
action, // Event Action
|
12
12
|
label // Event Label
|
13
|
-
)
|
13
|
+
)
|
14
14
|
}
|
15
15
|
|
16
|
-
function linkTrackingEventHandler(action) {
|
17
|
-
return function() {
|
18
|
-
trackLinkClick(action, $(this))
|
19
|
-
}
|
20
|
-
}
|
16
|
+
function linkTrackingEventHandler (action) {
|
17
|
+
return function () {
|
18
|
+
trackLinkClick(action, $(this))
|
19
|
+
}
|
20
|
+
}
|
21
21
|
|
22
|
-
function catchBrokenFragmentLinks() {
|
23
|
-
var fragment = window.location.hash
|
24
|
-
var $target = $(fragment)
|
25
|
-
if(!$target.get(0)) {
|
22
|
+
function catchBrokenFragmentLinks () {
|
23
|
+
var fragment = window.location.hash
|
24
|
+
var $target = $(fragment)
|
25
|
+
if (!$target.get(0)) {
|
26
26
|
ga(
|
27
27
|
'send',
|
28
28
|
'event',
|
29
29
|
'Broken fragment ID', // Event Category
|
30
30
|
'pageview', // Event Action
|
31
31
|
window.location.pathname + fragment // Event Label
|
32
|
-
)
|
32
|
+
)
|
33
33
|
}
|
34
34
|
}
|
35
35
|
|
36
|
-
$(document).on('ready', function() {
|
36
|
+
$(document).on('ready', function () {
|
37
37
|
if (typeof ga === 'undefined') {
|
38
|
-
return
|
38
|
+
return
|
39
39
|
}
|
40
40
|
|
41
|
-
$('.technical-documentation a').on('click', linkTrackingEventHandler('inTextClick'))
|
42
|
-
$('.header a').on('click', linkTrackingEventHandler('topNavigationClick'))
|
43
|
-
$('.toc a').on('click', linkTrackingEventHandler('tableOfContentsNavigationClick'))
|
44
|
-
catchBrokenFragmentLinks()
|
41
|
+
$('.technical-documentation a').on('click', linkTrackingEventHandler('inTextClick'))
|
42
|
+
$('.header a').on('click', linkTrackingEventHandler('topNavigationClick'))
|
43
|
+
$('.toc a').on('click', linkTrackingEventHandler('tableOfContentsNavigationClick'))
|
44
|
+
catchBrokenFragmentLinks()
|
45
45
|
|
46
46
|
// Borrowed from:
|
47
47
|
// https://github.com/alphagov/govuk_frontend_toolkit/blob/master/javascripts/govuk/analytics/analytics.js
|
@@ -50,9 +50,9 @@
|
|
50
50
|
var POSTCODE_PATTERN = /[A-PR-UWYZ][A-HJ-Z]?[0-9][0-9A-HJKMNPR-Y]?(?:[\s+]|%20)*[0-9][ABD-HJLNPQ-Z]{2}/gi
|
51
51
|
var DATE_PATTERN = /\d{4}(-?)\d{2}(-?)\d{2}/g
|
52
52
|
var stripped = string.replace(EMAIL_PATTERN, '[email]')
|
53
|
-
|
54
|
-
|
53
|
+
.replace(DATE_PATTERN, '[date]')
|
54
|
+
.replace(POSTCODE_PATTERN, '[postcode]')
|
55
55
|
return stripped
|
56
56
|
}
|
57
|
-
})
|
58
|
-
})(jQuery)
|
57
|
+
})
|
58
|
+
})(jQuery)
|
@@ -1,57 +1,56 @@
|
|
1
|
-
(function($, root) {
|
2
|
-
|
3
|
-
root.GOVUK = root.GOVUK || {}
|
4
|
-
GOVUK.Modules = GOVUK.Modules || {}
|
1
|
+
(function ($, root) {
|
2
|
+
'use strict'
|
3
|
+
root.GOVUK = root.GOVUK || {}
|
4
|
+
GOVUK.Modules = GOVUK.Modules || {}
|
5
5
|
|
6
6
|
GOVUK.modules = {
|
7
|
-
find: function(container) {
|
8
|
-
var modules
|
9
|
-
|
10
|
-
|
7
|
+
find: function (container) {
|
8
|
+
var modules
|
9
|
+
var moduleSelector = '[data-module]'
|
10
|
+
var component = container || $('body')
|
11
11
|
|
12
|
-
modules =
|
12
|
+
modules = component.find(moduleSelector)
|
13
13
|
|
14
14
|
// Container could be a module too
|
15
|
-
if (
|
16
|
-
modules = modules.add(
|
15
|
+
if (component.is(moduleSelector)) {
|
16
|
+
modules = modules.add(component)
|
17
17
|
}
|
18
18
|
|
19
|
-
return modules
|
19
|
+
return modules
|
20
20
|
},
|
21
21
|
|
22
|
-
start: function(container) {
|
23
|
-
var modules = this.find(container)
|
22
|
+
start: function (container) {
|
23
|
+
var modules = this.find(container)
|
24
24
|
|
25
25
|
for (var i = 0, l = modules.length; i < l; i++) {
|
26
|
-
var module
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
module
|
34
|
-
|
35
|
-
element.data('module-started', true);
|
26
|
+
var module
|
27
|
+
var element = $(modules[i])
|
28
|
+
var type = camelCaseAndCapitalise(element.data('module'))
|
29
|
+
var started = element.data('module-started')
|
30
|
+
|
31
|
+
if (typeof GOVUK.Modules[type] === 'function' && !started) {
|
32
|
+
module = new GOVUK.Modules[type]()
|
33
|
+
module.start(element)
|
34
|
+
element.data('module-started', true)
|
36
35
|
}
|
37
36
|
}
|
38
37
|
|
39
38
|
// eg selectable-table to SelectableTable
|
40
|
-
function camelCaseAndCapitalise(string) {
|
41
|
-
return capitaliseFirstLetter(camelCase(string))
|
39
|
+
function camelCaseAndCapitalise (string) {
|
40
|
+
return capitaliseFirstLetter(camelCase(string))
|
42
41
|
}
|
43
42
|
|
44
43
|
// http://stackoverflow.com/questions/6660977/convert-hyphens-to-camel-case-camelcase
|
45
|
-
function camelCase(string) {
|
44
|
+
function camelCase (string) {
|
46
45
|
return string.replace(/-([a-z])/g, function (g) {
|
47
|
-
return g[1].toUpperCase()
|
48
|
-
})
|
46
|
+
return g[1].toUpperCase()
|
47
|
+
})
|
49
48
|
}
|
50
49
|
|
51
50
|
// http://stackoverflow.com/questions/1026069/capitalize-the-first-letter-of-string-in-javascript
|
52
|
-
function capitaliseFirstLetter(string) {
|
53
|
-
return string.charAt(0).toUpperCase() + string.slice(1)
|
51
|
+
function capitaliseFirstLetter (string) {
|
52
|
+
return string.charAt(0).toUpperCase() + string.slice(1)
|
54
53
|
}
|
55
54
|
}
|
56
55
|
}
|
57
|
-
})(jQuery, window)
|
56
|
+
})(jQuery, window)
|
@@ -1,18 +1,18 @@
|
|
1
|
-
(function($, Modules) {
|
2
|
-
'use strict'
|
1
|
+
(function ($, Modules) {
|
2
|
+
'use strict'
|
3
3
|
|
4
|
-
Modules.AnchoredHeadings = function() {
|
5
|
-
this.start = function($element) {
|
6
|
-
var headings = $element.find('h1, h2, h3, h4, h5, h6')
|
7
|
-
headings.each(injectAnchor)
|
8
|
-
}
|
4
|
+
Modules.AnchoredHeadings = function () {
|
5
|
+
this.start = function ($element) {
|
6
|
+
var headings = $element.find('h1, h2, h3, h4, h5, h6')
|
7
|
+
headings.each(injectAnchor)
|
8
|
+
}
|
9
9
|
|
10
|
-
function injectAnchor() {
|
11
|
-
var $this = $(this)
|
12
|
-
$this.addClass('anchored-heading')
|
10
|
+
function injectAnchor () {
|
11
|
+
var $this = $(this)
|
12
|
+
$this.addClass('anchored-heading')
|
13
13
|
$this.prepend(
|
14
14
|
'<a href="#' + $this.attr('id') + '" class="anchored-heading__icon" aria-hidden="true"></a>'
|
15
|
-
)
|
16
|
-
}
|
17
|
-
}
|
18
|
-
})(jQuery, window.GOVUK.Modules)
|
15
|
+
)
|
16
|
+
}
|
17
|
+
}
|
18
|
+
})(jQuery, window.GOVUK.Modules)
|
@@ -1,95 +1,84 @@
|
|
1
|
-
(function($, Modules) {
|
2
|
-
'use strict'
|
1
|
+
(function ($, Modules) {
|
2
|
+
'use strict'
|
3
3
|
|
4
4
|
Modules.CollapsibleNavigation = function () {
|
5
|
-
|
6
|
-
var $
|
7
|
-
var $
|
8
|
-
var $topLevelItems;
|
9
|
-
var $headings;
|
10
|
-
var $listings;
|
11
|
-
|
12
|
-
var $openLink;
|
13
|
-
var $closeLink;
|
5
|
+
var $contentPane
|
6
|
+
var $nav
|
7
|
+
var $topLevelItems
|
14
8
|
|
15
9
|
this.start = function ($element) {
|
16
|
-
$contentPane = $('.app-pane__content')
|
17
|
-
$nav = $element
|
18
|
-
$topLevelItems = $nav.find('> ul > li')
|
19
|
-
$headings = $topLevelItems.find('> a');
|
20
|
-
$listings = $topLevelItems.find('> ul');
|
10
|
+
$contentPane = $('.app-pane__content')
|
11
|
+
$nav = $element
|
12
|
+
$topLevelItems = $nav.find('> ul > li')
|
21
13
|
|
22
14
|
// Attach collapsible heading functionality,on mobile and desktop
|
23
|
-
collapsibleHeadings()
|
24
|
-
openActiveHeading()
|
25
|
-
$contentPane.on('scroll', _.debounce(openActiveHeading, 100, { maxWait: 100 }))
|
26
|
-
|
27
|
-
};
|
15
|
+
collapsibleHeadings()
|
16
|
+
openActiveHeading()
|
17
|
+
$contentPane.on('scroll', _.debounce(openActiveHeading, 100, { maxWait: 100 }))
|
18
|
+
}
|
28
19
|
|
29
|
-
function collapsibleHeadings() {
|
20
|
+
function collapsibleHeadings () {
|
30
21
|
for (var i = $topLevelItems.length - 1; i >= 0; i--) {
|
31
|
-
var $topLevelItem = $($topLevelItems[i])
|
32
|
-
var $heading = $topLevelItem.find('> a')
|
33
|
-
var $listing = $topLevelItem.find('> ul')
|
34
|
-
var id = 'toc-' + $heading.text().toLowerCase().replace(' ', '-')
|
22
|
+
var $topLevelItem = $($topLevelItems[i])
|
23
|
+
var $heading = $topLevelItem.find('> a')
|
24
|
+
var $listing = $topLevelItem.find('> ul')
|
25
|
+
var id = 'toc-' + $heading.text().toLowerCase().replace(' ', '-')
|
35
26
|
// Only add collapsible functionality if there are children.
|
36
|
-
if ($listing.length
|
37
|
-
continue
|
27
|
+
if ($listing.length === 0) {
|
28
|
+
continue
|
38
29
|
}
|
39
|
-
$topLevelItem.addClass('collapsible')
|
30
|
+
$topLevelItem.addClass('collapsible')
|
40
31
|
$listing.addClass('collapsible__body')
|
41
|
-
|
42
|
-
|
32
|
+
.attr('id', id)
|
33
|
+
.attr('aria-expanded', 'false')
|
43
34
|
$heading.addClass('collapsible__heading')
|
44
|
-
|
45
|
-
$topLevelItem.on('click', '.collapsible__toggle', function(e) {
|
46
|
-
e.preventDefault()
|
47
|
-
var $parent = $(this).parent()
|
48
|
-
toggleHeading($parent)
|
49
|
-
})
|
35
|
+
.after('<button class="collapsible__toggle" aria-controls="' + id + '"><span class="collapsible__toggle-label">Expand ' + $heading.text() + '</span><span class="collapsible__toggle-icon" aria-hidden="true"></button>')
|
36
|
+
$topLevelItem.on('click', '.collapsible__toggle', function (e) {
|
37
|
+
e.preventDefault()
|
38
|
+
var $parent = $(this).parent()
|
39
|
+
toggleHeading($parent)
|
40
|
+
})
|
50
41
|
}
|
51
42
|
}
|
52
43
|
|
53
|
-
function toggleHeading($topLevelItem) {
|
54
|
-
var isOpen = $topLevelItem.hasClass('is-open')
|
55
|
-
var $heading = $topLevelItem.find('> a')
|
56
|
-
var $body = $topLevelItem.find('.collapsible__body')
|
57
|
-
var $toggleLabel = $topLevelItem.find('.collapsible__toggle-label')
|
44
|
+
function toggleHeading ($topLevelItem) {
|
45
|
+
var isOpen = $topLevelItem.hasClass('is-open')
|
46
|
+
var $heading = $topLevelItem.find('> a')
|
47
|
+
var $body = $topLevelItem.find('.collapsible__body')
|
48
|
+
var $toggleLabel = $topLevelItem.find('.collapsible__toggle-label')
|
58
49
|
|
59
|
-
$topLevelItem.toggleClass('is-open', !isOpen)
|
60
|
-
$body.attr('aria-expanded', isOpen ? 'false' : 'true')
|
61
|
-
$toggleLabel.text(isOpen ? 'Expand ' + $heading.text() : 'Collapse ' + $heading.text())
|
50
|
+
$topLevelItem.toggleClass('is-open', !isOpen)
|
51
|
+
$body.attr('aria-expanded', isOpen ? 'false' : 'true')
|
52
|
+
$toggleLabel.text(isOpen ? 'Expand ' + $heading.text() : 'Collapse ' + $heading.text())
|
62
53
|
}
|
63
54
|
|
64
|
-
function openActiveHeading() {
|
65
|
-
var $activeElement
|
66
|
-
var currentPath = window.location.pathname
|
67
|
-
var isActiveTrail = '[href*="' + currentPath + '"]'
|
55
|
+
function openActiveHeading () {
|
56
|
+
var $activeElement
|
57
|
+
var currentPath = window.location.pathname
|
58
|
+
var isActiveTrail = '[href*="' + currentPath + '"]'
|
68
59
|
// Add an exception for the root page, as every href includes /
|
69
|
-
if(currentPath
|
60
|
+
if (currentPath === '/') {
|
70
61
|
isActiveTrail = '[href="' + currentPath + window.location.hash + '"]'
|
71
62
|
}
|
72
63
|
for (var i = $topLevelItems.length - 1; i >= 0; i--) {
|
73
|
-
var $element = $($topLevelItems[i])
|
74
|
-
var $heading = $element.find('> a')
|
64
|
+
var $element = $($topLevelItems[i])
|
65
|
+
var $heading = $element.find('> a')
|
75
66
|
// Check if this item href matches
|
76
|
-
if($heading.is(isActiveTrail)) {
|
77
|
-
$activeElement = $element
|
78
|
-
break
|
67
|
+
if ($heading.is(isActiveTrail)) {
|
68
|
+
$activeElement = $element
|
69
|
+
break
|
79
70
|
}
|
80
71
|
// Otherwise check the children
|
81
|
-
var $children = $element.find('li > a')
|
82
|
-
var $matchingChildren = $children.filter(isActiveTrail)
|
72
|
+
var $children = $element.find('li > a')
|
73
|
+
var $matchingChildren = $children.filter(isActiveTrail)
|
83
74
|
if ($matchingChildren.length) {
|
84
|
-
$activeElement = $element
|
85
|
-
break
|
75
|
+
$activeElement = $element
|
76
|
+
break
|
86
77
|
}
|
87
78
|
}
|
88
|
-
if($activeElement && !$activeElement.hasClass('is-open')) {
|
89
|
-
toggleHeading($activeElement)
|
79
|
+
if ($activeElement && !$activeElement.hasClass('is-open')) {
|
80
|
+
toggleHeading($activeElement)
|
90
81
|
}
|
91
82
|
}
|
92
|
-
|
93
|
-
|
94
|
-
};
|
95
|
-
})(jQuery, window.GOVUK.Modules);
|
83
|
+
}
|
84
|
+
})(jQuery, window.GOVUK.Modules)
|
@@ -1,132 +1,132 @@
|
|
1
|
-
(function($, Modules) {
|
2
|
-
'use strict'
|
1
|
+
(function ($, Modules) {
|
2
|
+
'use strict'
|
3
3
|
|
4
|
-
Modules.InPageNavigation = function InPageNavigation() {
|
5
|
-
var $tocPane
|
6
|
-
var $contentPane
|
7
|
-
var $tocItems
|
8
|
-
var $targets
|
4
|
+
Modules.InPageNavigation = function InPageNavigation () {
|
5
|
+
var $tocPane
|
6
|
+
var $contentPane
|
7
|
+
var $tocItems
|
8
|
+
var $targets
|
9
9
|
|
10
|
-
this.start = function start($element) {
|
11
|
-
$tocPane = $element.find('.app-pane__toc')
|
12
|
-
$contentPane = $element.find('.app-pane__content')
|
13
|
-
$tocItems = $('.js-toc-list').find('a')
|
14
|
-
$targets = $contentPane.find('[id]')
|
10
|
+
this.start = function start ($element) {
|
11
|
+
$tocPane = $element.find('.app-pane__toc')
|
12
|
+
$contentPane = $element.find('.app-pane__content')
|
13
|
+
$tocItems = $('.js-toc-list').find('a')
|
14
|
+
$targets = $contentPane.find('[id]')
|
15
15
|
|
16
|
-
$contentPane.on('scroll', _.debounce(handleScrollEvent, 100, { maxWait: 100 }))
|
16
|
+
$contentPane.on('scroll', _.debounce(handleScrollEvent, 100, { maxWait: 100 }))
|
17
17
|
|
18
18
|
if (Modernizr.history) {
|
19
19
|
// Popstate is triggered when using the back button to navigate 'within'
|
20
20
|
// the page, i.e. changing the anchor part of the URL.
|
21
21
|
$(window).on('popstate', function (event) {
|
22
|
-
restoreScrollPosition(event.originalEvent.state)
|
23
|
-
})
|
22
|
+
restoreScrollPosition(event.originalEvent.state)
|
23
|
+
})
|
24
24
|
|
25
25
|
if (history.state && history.state.scrollTop) {
|
26
26
|
// Restore existing state when e.g. using the back button to return to
|
27
27
|
// this page
|
28
|
-
restoreScrollPosition(history.state)
|
28
|
+
restoreScrollPosition(history.state)
|
29
29
|
} else {
|
30
30
|
// Store the initial position so that we can restore it even if we
|
31
31
|
// never scroll.
|
32
|
-
handleInitialLoadEvent()
|
32
|
+
handleInitialLoadEvent()
|
33
33
|
}
|
34
34
|
}
|
35
|
-
}
|
35
|
+
}
|
36
36
|
|
37
|
-
function restoreScrollPosition(state) {
|
37
|
+
function restoreScrollPosition (state) {
|
38
38
|
if (state && typeof state.scrollTop !== 'undefined') {
|
39
|
-
$contentPane.scrollTop(state.scrollTop)
|
39
|
+
$contentPane.scrollTop(state.scrollTop)
|
40
40
|
}
|
41
41
|
}
|
42
42
|
|
43
|
-
function handleInitialLoadEvent() {
|
44
|
-
var fragment = fragmentForTargetElement()
|
43
|
+
function handleInitialLoadEvent () {
|
44
|
+
var fragment = fragmentForTargetElement()
|
45
45
|
|
46
46
|
if (!fragment) {
|
47
|
-
fragment = fragmentForFirstElementInView()
|
47
|
+
fragment = fragmentForFirstElementInView()
|
48
48
|
}
|
49
49
|
|
50
|
-
handleChangeInActiveItem(fragment)
|
50
|
+
handleChangeInActiveItem(fragment)
|
51
51
|
}
|
52
52
|
|
53
|
-
function handleScrollEvent() {
|
54
|
-
handleChangeInActiveItem(fragmentForFirstElementInView())
|
53
|
+
function handleScrollEvent () {
|
54
|
+
handleChangeInActiveItem(fragmentForFirstElementInView())
|
55
55
|
}
|
56
56
|
|
57
|
-
function handleChangeInActiveItem(fragment) {
|
58
|
-
storeCurrentPositionInHistoryApi(fragment)
|
59
|
-
highlightActiveItemInToc(fragment)
|
57
|
+
function handleChangeInActiveItem (fragment) {
|
58
|
+
storeCurrentPositionInHistoryApi(fragment)
|
59
|
+
highlightActiveItemInToc(fragment)
|
60
60
|
}
|
61
61
|
|
62
|
-
function storeCurrentPositionInHistoryApi(fragment) {
|
62
|
+
function storeCurrentPositionInHistoryApi (fragment) {
|
63
63
|
if (Modernizr.history && fragment) {
|
64
64
|
history.replaceState(
|
65
65
|
{ scrollTop: $contentPane.scrollTop() },
|
66
|
-
|
66
|
+
'',
|
67
67
|
fragment
|
68
|
-
)
|
68
|
+
)
|
69
69
|
}
|
70
70
|
}
|
71
71
|
|
72
|
-
function highlightActiveItemInToc(fragment) {
|
72
|
+
function highlightActiveItemInToc (fragment) {
|
73
73
|
// Navigation items for single page navigation don't necessarily include the path name, but
|
74
74
|
// navigation items for multipage navigation items do include it. This checks for either case.
|
75
75
|
var $activeTocItem = $tocItems.filter(
|
76
76
|
'[href="' + window.location.pathname + fragment + '"],[href="' + fragment + '"]'
|
77
|
-
)
|
77
|
+
)
|
78
78
|
// Navigation items with children don't contain fragments in their url
|
79
79
|
// Check to see if any nav items contain just the path name.
|
80
|
-
if(!$activeTocItem.get(0)) {
|
81
|
-
$activeTocItem = $tocItems.filter('[href="' + window.location.pathname + '"]')
|
80
|
+
if (!$activeTocItem.get(0)) {
|
81
|
+
$activeTocItem = $tocItems.filter('[href="' + window.location.pathname + '"]')
|
82
82
|
}
|
83
83
|
if ($activeTocItem.get(0)) {
|
84
|
-
$tocItems.removeClass('toc-link--in-view')
|
85
|
-
$activeTocItem.addClass('toc-link--in-view')
|
86
|
-
scrollTocToActiveItem($activeTocItem)
|
84
|
+
$tocItems.removeClass('toc-link--in-view')
|
85
|
+
$activeTocItem.addClass('toc-link--in-view')
|
86
|
+
scrollTocToActiveItem($activeTocItem)
|
87
87
|
}
|
88
88
|
}
|
89
89
|
|
90
|
-
function scrollTocToActiveItem($activeTocItem) {
|
91
|
-
var paneHeight = $tocPane.height()
|
92
|
-
var linkTop = $activeTocItem.position().top
|
93
|
-
var linkBottom = linkTop + $activeTocItem.outerHeight()
|
90
|
+
function scrollTocToActiveItem ($activeTocItem) {
|
91
|
+
var paneHeight = $tocPane.height()
|
92
|
+
var linkTop = $activeTocItem.position().top
|
93
|
+
var linkBottom = linkTop + $activeTocItem.outerHeight()
|
94
94
|
|
95
|
-
var offset = null
|
95
|
+
var offset = null
|
96
96
|
|
97
97
|
if (linkTop < 0) {
|
98
|
-
offset = linkTop
|
98
|
+
offset = linkTop
|
99
99
|
} else if (linkBottom >= paneHeight) {
|
100
|
-
offset = -(paneHeight - linkBottom)
|
100
|
+
offset = -(paneHeight - linkBottom)
|
101
101
|
} else {
|
102
|
-
return
|
102
|
+
return
|
103
103
|
}
|
104
104
|
|
105
|
-
var newScrollTop = $tocPane.scrollTop() + offset
|
105
|
+
var newScrollTop = $tocPane.scrollTop() + offset
|
106
106
|
|
107
|
-
$tocPane.scrollTop(newScrollTop)
|
107
|
+
$tocPane.scrollTop(newScrollTop)
|
108
108
|
}
|
109
109
|
|
110
|
-
function fragmentForTargetElement() {
|
111
|
-
return window.location.hash
|
110
|
+
function fragmentForTargetElement () {
|
111
|
+
return window.location.hash
|
112
112
|
}
|
113
113
|
|
114
|
-
function fragmentForFirstElementInView() {
|
115
|
-
var result = null
|
114
|
+
function fragmentForFirstElementInView () {
|
115
|
+
var result = null
|
116
116
|
|
117
|
-
$($targets.get().reverse()).each(function checkIfInView(index) {
|
117
|
+
$($targets.get().reverse()).each(function checkIfInView (index) {
|
118
118
|
if (result) {
|
119
|
-
return
|
119
|
+
return
|
120
120
|
}
|
121
121
|
|
122
|
-
var $this = $(this)
|
122
|
+
var $this = $(this)
|
123
123
|
|
124
124
|
if (Math.floor($this.position().top) <= 0) {
|
125
|
-
result = $this
|
125
|
+
result = $this
|
126
126
|
}
|
127
|
-
})
|
127
|
+
})
|
128
128
|
|
129
|
-
return result ? '#' + result.attr('id') : false
|
129
|
+
return result ? '#' + result.attr('id') : false
|
130
130
|
}
|
131
|
-
}
|
132
|
-
})(jQuery, window.GOVUK.Modules)
|
131
|
+
}
|
132
|
+
})(jQuery, window.GOVUK.Modules)
|