@onsvisual/svelte-components 0.1.102-component.toolbar → 0.1.103
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.
- package/dist/@types/index.d.ts +1 -10
- package/dist/@types/inputs/AccessibleSelect/AccessibleSelect.svelte.d.ts +58 -0
- package/dist/@types/inputs/AccessibleSelect/options.d.ts +6 -0
- package/dist/@types/inputs/Button/Button.svelte.d.ts +2 -2
- package/dist/@types/inputs/Select/Select.svelte.d.ts +10 -10
- package/dist/@types/layout/Titleblock/Titleblock.svelte.d.ts +0 -2
- package/dist/css/main.css +1 -1
- package/dist/index.js +1 -10
- package/dist/inputs/AccessibleSelect/AccessibleSelect.svelte +280 -0
- package/dist/inputs/AccessibleSelect/options.js +263 -0
- package/dist/layout/AnalyticsBanner/AnalyticsBanner.svelte +41 -9
- package/dist/layout/Titleblock/Titleblock.svelte +0 -6
- package/package.json +4 -15
- package/dist/@types/inputs/ButtonGroup/ButtonGroup.svelte.d.ts +0 -33
- package/dist/@types/inputs/ButtonGroup/ButtonGroupItem.svelte.d.ts +0 -25
- package/dist/@types/inputs/Toolbar/HelpModal.svelte.d.ts +0 -19
- package/dist/@types/inputs/Toolbar/Icon.svelte.d.ts +0 -31
- package/dist/@types/inputs/Toolbar/ToolControl.svelte.d.ts +0 -27
- package/dist/@types/inputs/Toolbar/ToolControls.svelte.d.ts +0 -27
- package/dist/@types/inputs/Toolbar/Toolbar.svelte.d.ts +0 -33
- package/dist/@types/inputs/Toolbar/ToolbarButton.svelte.d.ts +0 -32
- package/dist/@types/inputs/Toolbar/ToolbarDivider.svelte.d.ts +0 -16
- package/dist/@types/inputs/Toolbar/ToolbarsContainer.svelte.d.ts +0 -19
- package/dist/inputs/ButtonGroup/ButtonGroup.svelte +0 -55
- package/dist/inputs/ButtonGroup/ButtonGroupItem.svelte +0 -103
- package/dist/inputs/Toolbar/HelpModal.svelte +0 -220
- package/dist/inputs/Toolbar/Icon.svelte +0 -142
- package/dist/inputs/Toolbar/ToolControl.svelte +0 -19
- package/dist/inputs/Toolbar/ToolControls.svelte +0 -8
- package/dist/inputs/Toolbar/Toolbar.svelte +0 -72
- package/dist/inputs/Toolbar/ToolbarButton.svelte +0 -162
- package/dist/inputs/Toolbar/ToolbarDivider.svelte +0 -27
- package/dist/inputs/Toolbar/ToolbarsContainer.svelte +0 -61
package/dist/index.js
CHANGED
|
@@ -41,6 +41,7 @@ export { default as Titleblock } from "./layout/Titleblock/Titleblock.svelte";
|
|
|
41
41
|
export { default as Twisty } from "./layout/Twisty/Twisty.svelte";
|
|
42
42
|
|
|
43
43
|
// Inputs
|
|
44
|
+
export { default as AccessibleSelect } from "./inputs/AccessibleSelect/AccessibleSelect.svelte";
|
|
44
45
|
export { default as Button } from "./inputs/Button/Button.svelte";
|
|
45
46
|
export { default as Checkbox } from "./inputs/Checkbox/Checkbox.svelte";
|
|
46
47
|
export { default as Checkboxes } from "./inputs/Checkboxes/Checkboxes.svelte";
|
|
@@ -52,16 +53,6 @@ export { default as Radio } from "./inputs/Radios/Radio.svelte";
|
|
|
52
53
|
export { default as Radios } from "./inputs/Radios/Radios.svelte";
|
|
53
54
|
export { default as Select } from "./inputs/Select/Select.svelte";
|
|
54
55
|
export { default as Textarea } from "./inputs/Textarea/Textarea.svelte";
|
|
55
|
-
export { default as HelpModal } from "./inputs/Toolbar/HelpModal.svelte";
|
|
56
|
-
export { default as Icon } from "./inputs/Toolbar/Icon.svelte";
|
|
57
|
-
export { default as Toolbar } from "./inputs/Toolbar/Toolbar.svelte";
|
|
58
|
-
export { default as ToolbarButton } from "./inputs/Toolbar/ToolbarButton.svelte";
|
|
59
|
-
export { default as ToolbarDivider } from "./inputs/Toolbar/ToolbarDivider.svelte";
|
|
60
|
-
export { default as ToolbarsContainer } from "./inputs/Toolbar/ToolbarsContainer.svelte";
|
|
61
|
-
export { default as ToolControl } from "./inputs/Toolbar/ToolControl.svelte";
|
|
62
|
-
export { default as ToolControls } from "./inputs/Toolbar/ToolControls.svelte";
|
|
63
|
-
export { default as ButtonGroup } from "./inputs/ButtonGroup/ButtonGroup.svelte";
|
|
64
|
-
export { default as ButtonGroupItem } from "./inputs/ButtonGroup/ButtonGroupItem.svelte";
|
|
65
56
|
|
|
66
57
|
// Decorators
|
|
67
58
|
export { default as Blockquote } from "./decorators/Blockquote/Blockquote.svelte";
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
|
|
4
|
+
import { onMount, createEventDispatcher } from "svelte";
|
|
5
|
+
|
|
6
|
+
const dispatch = createEventDispatcher();
|
|
7
|
+
const sleep = (ms = 1000) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
8
|
+
const chevron = (opts) =>
|
|
9
|
+
`<svg class="${opts?.className}" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" viewBox="0 0 11.75 7.7" width="18" style="z-index:1"><path fill="currentColor" d="m1.37.15 4.5 5.1 4.5-5.1a.37.37 0 0 1 .6 0l.7.7a.45.45 0 0 1 0 .5l-5.5 6.2a.37.37 0 0 1-.6 0l-5.5-6.1a.64.64 0 0 1 0-.6l.7-.7a.64.64 0 0 1 .6 0Z"></path></svg>`;
|
|
10
|
+
|
|
11
|
+
let inputElement;
|
|
12
|
+
let scriptLoaded;
|
|
13
|
+
let accessibleAutocomplete;
|
|
14
|
+
let hideMenu = false;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Unique id for the element
|
|
18
|
+
* @type {string}
|
|
19
|
+
*/
|
|
20
|
+
export let id = "autocomplete";
|
|
21
|
+
/**
|
|
22
|
+
* The mode can be either "default" or "search"
|
|
23
|
+
* @type {"default"|"search"}
|
|
24
|
+
*/
|
|
25
|
+
export let mode = "default";
|
|
26
|
+
/**
|
|
27
|
+
* Defines whether the selection can be cleared
|
|
28
|
+
* @type {boolean}
|
|
29
|
+
*/
|
|
30
|
+
export let clearable = mode !== "search";
|
|
31
|
+
/**
|
|
32
|
+
* Clear value on selection (default for "search" mode)
|
|
33
|
+
* @type {boolean}
|
|
34
|
+
*/
|
|
35
|
+
export let autoClear = mode === "search";
|
|
36
|
+
/**
|
|
37
|
+
* A label to describe the element (expected for accessibility)
|
|
38
|
+
* @type {string}
|
|
39
|
+
*/
|
|
40
|
+
export let label = mode === "search" ? "Type to select" : "Select an option";
|
|
41
|
+
/**
|
|
42
|
+
* Visually hide the label
|
|
43
|
+
* @type {boolean}
|
|
44
|
+
*/
|
|
45
|
+
export let hideLabel = false;
|
|
46
|
+
/**
|
|
47
|
+
* An optional placeholder text
|
|
48
|
+
* @type {string}
|
|
49
|
+
*/
|
|
50
|
+
export let placeholder = mode === "search" ? "Enter text" : "Select one";
|
|
51
|
+
/**
|
|
52
|
+
* A prop to bind to for the selected value
|
|
53
|
+
* @type {object}
|
|
54
|
+
*/
|
|
55
|
+
export let value = null;
|
|
56
|
+
/**
|
|
57
|
+
* An array of options, formatted {id, label}
|
|
58
|
+
* @type {array}
|
|
59
|
+
*/
|
|
60
|
+
export let options = [];
|
|
61
|
+
/**
|
|
62
|
+
* The attribute of an option that defines its label/name
|
|
63
|
+
* @type {string}
|
|
64
|
+
*/
|
|
65
|
+
export let labelKey = "label";
|
|
66
|
+
/**
|
|
67
|
+
* The attribute of an option that defines its group (optional)
|
|
68
|
+
* @type {string|null}
|
|
69
|
+
*/
|
|
70
|
+
export let groupKey = null;
|
|
71
|
+
/**
|
|
72
|
+
* Optional: Minimum query length to return results
|
|
73
|
+
* @type {number}
|
|
74
|
+
*/
|
|
75
|
+
export let minLength = mode === "search" ? 1 : 0;
|
|
76
|
+
/**
|
|
77
|
+
* Optional: Override function for loading/filtering options based on the entered text
|
|
78
|
+
* @type {function}
|
|
79
|
+
*/
|
|
80
|
+
export let loadOptions = (query, populateResults) => {
|
|
81
|
+
const filteredResults =
|
|
82
|
+
mode !== "search" && options.map((opt) => opt[labelKey]).includes(query)
|
|
83
|
+
? options
|
|
84
|
+
: options.filter((opt) =>
|
|
85
|
+
opt[labelKey].match(new RegExp(`\\b${query.replace(/[^\w\s]/gi, "")}`, "i"))
|
|
86
|
+
);
|
|
87
|
+
populateResults(filteredResults);
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* Optional: Override the default CDN URL for the accessible-autocomplete script
|
|
91
|
+
* @type {string}
|
|
92
|
+
*/
|
|
93
|
+
export let scriptUrl =
|
|
94
|
+
"https://cdn.ons.gov.uk/vendor/accessible-autocomplete/3.0.1/accessible-autocomplete.min.js";
|
|
95
|
+
|
|
96
|
+
// This clearing method is a bit of a hack, but no better options available at present
|
|
97
|
+
// https://github.com/alphagov/accessible-autocomplete/issues/390
|
|
98
|
+
/**
|
|
99
|
+
* Call this function externally to clear the input
|
|
100
|
+
* @type {function}
|
|
101
|
+
*/
|
|
102
|
+
export async function clearInput() {
|
|
103
|
+
hideMenu = true;
|
|
104
|
+
inputElement.value = "";
|
|
105
|
+
await sleep(110);
|
|
106
|
+
inputElement.focus({ preventScroll: true });
|
|
107
|
+
inputElement.blur();
|
|
108
|
+
hideMenu = false;
|
|
109
|
+
dispatch("clear", value);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function inputValueTemplate(result) {
|
|
113
|
+
return result && result[labelKey];
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function highlight(text, query = "") {
|
|
117
|
+
return text.replace(
|
|
118
|
+
new RegExp(`\\b${query.replace(/[^\w\s]/gi, "")}`, "i"),
|
|
119
|
+
(str) => `<b>${str}</b>`
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
function suggestionTemplate(result) {
|
|
124
|
+
const query = inputElement?.value || "";
|
|
125
|
+
return (
|
|
126
|
+
result &&
|
|
127
|
+
(groupKey
|
|
128
|
+
? `${highlight(result?.[labelKey] || "", query)} <span class="muted-text">${
|
|
129
|
+
result[groupKey]
|
|
130
|
+
}</span>`
|
|
131
|
+
: highlight(result?.[labelKey] || "", query))
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
async function select(option) {
|
|
136
|
+
value = option;
|
|
137
|
+
dispatch("change", value);
|
|
138
|
+
if (value && autoClear) {
|
|
139
|
+
await sleep(0);
|
|
140
|
+
clearInput();
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function inputChange(e) {
|
|
145
|
+
if (!e.target.value) select(null);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function handleScriptLoad() {
|
|
149
|
+
if (!scriptLoaded && window?.accessibleAutocomplete) {
|
|
150
|
+
accessibleAutocomplete = window.accessibleAutocomplete;
|
|
151
|
+
scriptLoaded = true;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function initAutocomplete(element) {
|
|
156
|
+
accessibleAutocomplete({
|
|
157
|
+
element,
|
|
158
|
+
id,
|
|
159
|
+
name: `${id}-input`,
|
|
160
|
+
source: loadOptions,
|
|
161
|
+
defaultValue: value?.[labelKey] || "",
|
|
162
|
+
autoselect: true,
|
|
163
|
+
onConfirm: select,
|
|
164
|
+
confirmOnBlur: false,
|
|
165
|
+
placeholder,
|
|
166
|
+
displayMenu: "overlay",
|
|
167
|
+
showAllValues: mode === "default",
|
|
168
|
+
dropdownArrow: chevron,
|
|
169
|
+
minLength,
|
|
170
|
+
templates: {
|
|
171
|
+
inputValue: inputValueTemplate,
|
|
172
|
+
suggestion: suggestionTemplate,
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
inputElement = document.getElementById(id);
|
|
176
|
+
inputElement.addEventListener("blur", inputChange);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
onMount(handleScriptLoad);
|
|
180
|
+
</script>
|
|
181
|
+
|
|
182
|
+
<svelte:head>
|
|
183
|
+
<script src="{scriptUrl}" on:load="{handleScriptLoad}"></script>
|
|
184
|
+
</svelte:head>
|
|
185
|
+
|
|
186
|
+
<div class="ons-field">
|
|
187
|
+
{#if label}<label for="{id}" class="ons-label" class:ons-u-vh="{hideLabel}">{label}</label>{/if}
|
|
188
|
+
<div class="ons-autocomplete-wrapper">
|
|
189
|
+
{#if scriptLoaded}
|
|
190
|
+
<div
|
|
191
|
+
id="{id}-container"
|
|
192
|
+
class="ons-autocomplete"
|
|
193
|
+
class:hide-menu="{hideMenu}"
|
|
194
|
+
use:initAutocomplete
|
|
195
|
+
></div>
|
|
196
|
+
{#if clearable && !autoClear && value}
|
|
197
|
+
<button
|
|
198
|
+
type="reset"
|
|
199
|
+
title="Clear selection"
|
|
200
|
+
aria-label="Clear selection"
|
|
201
|
+
on:click="{clearInput}"
|
|
202
|
+
class="ons-autocomplete-clear"
|
|
203
|
+
>
|
|
204
|
+
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" viewBox="0 0 14 14" width="18">
|
|
205
|
+
<path
|
|
206
|
+
fill="currentColor"
|
|
207
|
+
d="M13.6 1 l -0.71 -0.71 a 0.5 0.5 0 0 0 -0.71 0 l -5.25 5.25 l -5.25 -5.25 a 0.51 0.51 0 0 0 -0.71 0 l -0.71 0.71 a 0.5 0.5 0 0 0 0 0.71 l 5.25 5.25 l -5.25 5.25 a 0.5 0.5 0 0 0 0 0.71 l 0.71 0.71 a 0.5 0.5 0 0 0 0.71 0 l 5.25 -5.25 l 5.25 5.25 a 0.5 0.5 0 0 0 0.71 0 l 0.71 -0.71 a 0.5 0.5 0 0 0 0 -0.71 l -5.25 -5.25 l 5.25 -5.25 a 0.5 0.5 0 0 0 0 -0.71Z"
|
|
208
|
+
></path>
|
|
209
|
+
</svg>
|
|
210
|
+
</button>
|
|
211
|
+
{/if}
|
|
212
|
+
{/if}
|
|
213
|
+
</div>
|
|
214
|
+
</div>
|
|
215
|
+
|
|
216
|
+
<style>
|
|
217
|
+
.ons-autocomplete-wrapper {
|
|
218
|
+
position: relative;
|
|
219
|
+
}
|
|
220
|
+
.ons-autocomplete-clear {
|
|
221
|
+
position: absolute;
|
|
222
|
+
display: flex;
|
|
223
|
+
align-items: center;
|
|
224
|
+
align-content: center;
|
|
225
|
+
z-index: 1;
|
|
226
|
+
right: 3px;
|
|
227
|
+
top: calc(50% - 14px);
|
|
228
|
+
height: 28px;
|
|
229
|
+
width: 28px;
|
|
230
|
+
border: none;
|
|
231
|
+
background: white;
|
|
232
|
+
}
|
|
233
|
+
.ons-autocomplete-clear:focus {
|
|
234
|
+
outline: 3px solid #fbc900 !important;
|
|
235
|
+
}
|
|
236
|
+
.hide-menu :global(.autocomplete__menu) {
|
|
237
|
+
display: none;
|
|
238
|
+
}
|
|
239
|
+
.ons-autocomplete :global(.autocomplete__input) {
|
|
240
|
+
border-radius: 3px !important;
|
|
241
|
+
border-width: 1px !important;
|
|
242
|
+
background: white;
|
|
243
|
+
}
|
|
244
|
+
.ons-autocomplete :global(.autocomplete__input--focused) {
|
|
245
|
+
box-shadow: inset 0 0 0 1px black !important;
|
|
246
|
+
outline-color: #fbc900 !important;
|
|
247
|
+
}
|
|
248
|
+
.ons-autocomplete :global(.autocomplete__dropdown-arrow-down) {
|
|
249
|
+
width: 18px !important;
|
|
250
|
+
transform: translateY(-2px);
|
|
251
|
+
}
|
|
252
|
+
.ons-autocomplete :global(.muted-text) {
|
|
253
|
+
opacity: 0.8;
|
|
254
|
+
font-size: smaller;
|
|
255
|
+
}
|
|
256
|
+
.ons-autocomplete-wrapper :global(*) {
|
|
257
|
+
font-size: 18px;
|
|
258
|
+
}
|
|
259
|
+
.ons-autocomplete-wrapper :global(.autocomplete__hint),
|
|
260
|
+
.ons-autocomplete-wrapper :global(.autocomplete__input) {
|
|
261
|
+
height: 40px;
|
|
262
|
+
}
|
|
263
|
+
.ons-autocomplete-wrapper :global(.autocomplete__option) {
|
|
264
|
+
margin: 0;
|
|
265
|
+
}
|
|
266
|
+
.ons-autocomplete-wrapper :global(.autocomplete__menu) {
|
|
267
|
+
transform: translateY(5px);
|
|
268
|
+
border: 1px solid currentColor;
|
|
269
|
+
border-radius: 3px;
|
|
270
|
+
}
|
|
271
|
+
.ons-autocomplete-wrapper :global(.autocomplete__option--focused),
|
|
272
|
+
.ons-autocomplete-wrapper :global(.autocomplete__option:hover) {
|
|
273
|
+
background-color: var(--ons-color-branded-secondary, #003c57);
|
|
274
|
+
}
|
|
275
|
+
.ons-autocomplete-wrapper :global(.autocomplete__option:focus) {
|
|
276
|
+
outline: none !important;
|
|
277
|
+
}
|
|
278
|
+
.ons-autocomplete-wrapper :global(input) {
|
|
279
|
+
padding: 0 35px 0 8px;
|
|
280
|
+
}</style>
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
export default [
|
|
2
|
+
{ id: "AF", label: "Afghanistan", group: "Asia" },
|
|
3
|
+
{ id: "AX", label: "Åland Islands", group: "Europe" },
|
|
4
|
+
{ id: "AL", label: "Albania", group: "Europe" },
|
|
5
|
+
{ id: "DZ", label: "Algeria", group: "Africa" },
|
|
6
|
+
{ id: "AS", label: "American Samoa", group: "Oceania" },
|
|
7
|
+
{ id: "AD", label: "Andorra", group: "Europe" },
|
|
8
|
+
{ id: "AO", label: "Angola", group: "Africa" },
|
|
9
|
+
{ id: "AI", label: "Anguilla", group: "Americas" },
|
|
10
|
+
{ id: "AQ", label: "Antarctica", group: "" },
|
|
11
|
+
{ id: "AG", label: "Antigua and Barbuda", group: "Americas" },
|
|
12
|
+
{ id: "AR", label: "Argentina", group: "Americas" },
|
|
13
|
+
{ id: "AM", label: "Armenia", group: "Asia" },
|
|
14
|
+
{ id: "AW", label: "Aruba", group: "Americas" },
|
|
15
|
+
{ id: "AU", label: "Australia", group: "Oceania" },
|
|
16
|
+
{ id: "AT", label: "Austria", group: "Europe" },
|
|
17
|
+
{ id: "AZ", label: "Azerbaijan", group: "Asia" },
|
|
18
|
+
{ id: "BS", label: "Bahamas", group: "Americas" },
|
|
19
|
+
{ id: "BH", label: "Bahrain", group: "Asia" },
|
|
20
|
+
{ id: "BD", label: "Bangladesh", group: "Asia" },
|
|
21
|
+
{ id: "BB", label: "Barbados", group: "Americas" },
|
|
22
|
+
{ id: "BY", label: "Belarus", group: "Europe" },
|
|
23
|
+
{ id: "BE", label: "Belgium", group: "Europe" },
|
|
24
|
+
{ id: "BZ", label: "Belize", group: "Americas" },
|
|
25
|
+
{ id: "BJ", label: "Benin", group: "Africa" },
|
|
26
|
+
{ id: "BM", label: "Bermuda", group: "Americas" },
|
|
27
|
+
{ id: "BT", label: "Bhutan", group: "Asia" },
|
|
28
|
+
{ id: "BO", label: "Bolivia, Plurinational State of", group: "Americas" },
|
|
29
|
+
{ id: "BQ", label: "Bonaire, Sint Eustatius and Saba", group: "Americas" },
|
|
30
|
+
{ id: "BA", label: "Bosnia and Herzegovina", group: "Europe" },
|
|
31
|
+
{ id: "BW", label: "Botswana", group: "Africa" },
|
|
32
|
+
{ id: "BV", label: "Bouvet Island", group: "Americas" },
|
|
33
|
+
{ id: "BR", label: "Brazil", group: "Americas" },
|
|
34
|
+
{ id: "IO", label: "British Indian Ocean Territory", group: "Africa" },
|
|
35
|
+
{ id: "BN", label: "Brunei Darussalam", group: "Asia" },
|
|
36
|
+
{ id: "BG", label: "Bulgaria", group: "Europe" },
|
|
37
|
+
{ id: "BF", label: "Burkina Faso", group: "Africa" },
|
|
38
|
+
{ id: "BI", label: "Burundi", group: "Africa" },
|
|
39
|
+
{ id: "CV", label: "Cabo Verde", group: "Africa" },
|
|
40
|
+
{ id: "KH", label: "Cambodia", group: "Asia" },
|
|
41
|
+
{ id: "CM", label: "Cameroon", group: "Africa" },
|
|
42
|
+
{ id: "CA", label: "Canada", group: "Americas" },
|
|
43
|
+
{ id: "KY", label: "Cayman Islands", group: "Americas" },
|
|
44
|
+
{ id: "CF", label: "Central African Republic", group: "Africa" },
|
|
45
|
+
{ id: "TD", label: "Chad", group: "Africa" },
|
|
46
|
+
{ id: "CL", label: "Chile", group: "Americas" },
|
|
47
|
+
{ id: "CN", label: "China", group: "Asia" },
|
|
48
|
+
{ id: "CX", label: "Christmas Island", group: "Oceania" },
|
|
49
|
+
{ id: "CC", label: "Cocos (Keeling) Islands", group: "Oceania" },
|
|
50
|
+
{ id: "CO", label: "Colombia", group: "Americas" },
|
|
51
|
+
{ id: "KM", label: "Comoros", group: "Africa" },
|
|
52
|
+
{ id: "CG", label: "Congo", group: "Africa" },
|
|
53
|
+
{ id: "CD", label: "Congo, Democratic Republic of the", group: "Africa" },
|
|
54
|
+
{ id: "CK", label: "Cook Islands", group: "Oceania" },
|
|
55
|
+
{ id: "CR", label: "Costa Rica", group: "Americas" },
|
|
56
|
+
{ id: "CI", label: "Côte d'Ivoire", group: "Africa" },
|
|
57
|
+
{ id: "HR", label: "Croatia", group: "Europe" },
|
|
58
|
+
{ id: "CU", label: "Cuba", group: "Americas" },
|
|
59
|
+
{ id: "CW", label: "Curaçao", group: "Americas" },
|
|
60
|
+
{ id: "CY", label: "Cyprus", group: "Asia" },
|
|
61
|
+
{ id: "CZ", label: "Czechia", group: "Europe" },
|
|
62
|
+
{ id: "DK", label: "Denmark", group: "Europe" },
|
|
63
|
+
{ id: "DJ", label: "Djibouti", group: "Africa" },
|
|
64
|
+
{ id: "DM", label: "Dominica", group: "Americas" },
|
|
65
|
+
{ id: "DO", label: "Dominican Republic", group: "Americas" },
|
|
66
|
+
{ id: "EC", label: "Ecuador", group: "Americas" },
|
|
67
|
+
{ id: "EG", label: "Egypt", group: "Africa" },
|
|
68
|
+
{ id: "SV", label: "El Salvador", group: "Americas" },
|
|
69
|
+
{ id: "GQ", label: "Equatorial Guinea", group: "Africa" },
|
|
70
|
+
{ id: "ER", label: "Eritrea", group: "Africa" },
|
|
71
|
+
{ id: "EE", label: "Estonia", group: "Europe" },
|
|
72
|
+
{ id: "SZ", label: "Eswatini", group: "Africa" },
|
|
73
|
+
{ id: "ET", label: "Ethiopia", group: "Africa" },
|
|
74
|
+
{ id: "FK", label: "Falkland Islands (Malvinas)", group: "Americas" },
|
|
75
|
+
{ id: "FO", label: "Faroe Islands", group: "Europe" },
|
|
76
|
+
{ id: "FJ", label: "Fiji", group: "Oceania" },
|
|
77
|
+
{ id: "FI", label: "Finland", group: "Europe" },
|
|
78
|
+
{ id: "FR", label: "France", group: "Europe" },
|
|
79
|
+
{ id: "GF", label: "French Guiana", group: "Americas" },
|
|
80
|
+
{ id: "PF", label: "French Polynesia", group: "Oceania" },
|
|
81
|
+
{ id: "TF", label: "French Southern Territories", group: "Africa" },
|
|
82
|
+
{ id: "GA", label: "Gabon", group: "Africa" },
|
|
83
|
+
{ id: "GM", label: "Gambia", group: "Africa" },
|
|
84
|
+
{ id: "GE", label: "Georgia", group: "Asia" },
|
|
85
|
+
{ id: "DE", label: "Germany", group: "Europe" },
|
|
86
|
+
{ id: "GH", label: "Ghana", group: "Africa" },
|
|
87
|
+
{ id: "GI", label: "Gibraltar", group: "Europe" },
|
|
88
|
+
{ id: "GR", label: "Greece", group: "Europe" },
|
|
89
|
+
{ id: "GL", label: "Greenland", group: "Americas" },
|
|
90
|
+
{ id: "GD", label: "Grenada", group: "Americas" },
|
|
91
|
+
{ id: "GP", label: "Guadeloupe", group: "Americas" },
|
|
92
|
+
{ id: "GU", label: "Guam", group: "Oceania" },
|
|
93
|
+
{ id: "GT", label: "Guatemala", group: "Americas" },
|
|
94
|
+
{ id: "GG", label: "Guernsey", group: "Europe" },
|
|
95
|
+
{ id: "GN", label: "Guinea", group: "Africa" },
|
|
96
|
+
{ id: "GW", label: "Guinea-Bissau", group: "Africa" },
|
|
97
|
+
{ id: "GY", label: "Guyana", group: "Americas" },
|
|
98
|
+
{ id: "HT", label: "Haiti", group: "Americas" },
|
|
99
|
+
{ id: "HM", label: "Heard Island and McDonald Islands", group: "Oceania" },
|
|
100
|
+
{ id: "VA", label: "Holy See", group: "Europe" },
|
|
101
|
+
{ id: "HN", label: "Honduras", group: "Americas" },
|
|
102
|
+
{ id: "HK", label: "Hong Kong", group: "Asia" },
|
|
103
|
+
{ id: "HU", label: "Hungary", group: "Europe" },
|
|
104
|
+
{ id: "IS", label: "Iceland", group: "Europe" },
|
|
105
|
+
{ id: "IN", label: "India", group: "Asia" },
|
|
106
|
+
{ id: "ID", label: "Indonesia", group: "Asia" },
|
|
107
|
+
{ id: "IR", label: "Iran, Islamic Republic of", group: "Asia" },
|
|
108
|
+
{ id: "IQ", label: "Iraq", group: "Asia" },
|
|
109
|
+
{ id: "IE", label: "Ireland", group: "Europe" },
|
|
110
|
+
{ id: "IM", label: "Isle of Man", group: "Europe" },
|
|
111
|
+
{ id: "IL", label: "Israel", group: "Asia" },
|
|
112
|
+
{ id: "IT", label: "Italy", group: "Europe" },
|
|
113
|
+
{ id: "JM", label: "Jamaica", group: "Americas" },
|
|
114
|
+
{ id: "JP", label: "Japan", group: "Asia" },
|
|
115
|
+
{ id: "JE", label: "Jersey", group: "Europe" },
|
|
116
|
+
{ id: "JO", label: "Jordan", group: "Asia" },
|
|
117
|
+
{ id: "KZ", label: "Kazakhstan", group: "Asia" },
|
|
118
|
+
{ id: "KE", label: "Kenya", group: "Africa" },
|
|
119
|
+
{ id: "KI", label: "Kiribati", group: "Oceania" },
|
|
120
|
+
{ id: "KP", label: "Korea, Democratic People's Republic of", group: "Asia" },
|
|
121
|
+
{ id: "KR", label: "Korea, Republic of", group: "Asia" },
|
|
122
|
+
{ id: "KW", label: "Kuwait", group: "Asia" },
|
|
123
|
+
{ id: "KG", label: "Kyrgyzstan", group: "Asia" },
|
|
124
|
+
{ id: "LA", label: "Lao People's Democratic Republic", group: "Asia" },
|
|
125
|
+
{ id: "LV", label: "Latvia", group: "Europe" },
|
|
126
|
+
{ id: "LB", label: "Lebanon", group: "Asia" },
|
|
127
|
+
{ id: "LS", label: "Lesotho", group: "Africa" },
|
|
128
|
+
{ id: "LR", label: "Liberia", group: "Africa" },
|
|
129
|
+
{ id: "LY", label: "Libya", group: "Africa" },
|
|
130
|
+
{ id: "LI", label: "Liechtenstein", group: "Europe" },
|
|
131
|
+
{ id: "LT", label: "Lithuania", group: "Europe" },
|
|
132
|
+
{ id: "LU", label: "Luxembourg", group: "Europe" },
|
|
133
|
+
{ id: "MO", label: "Macao", group: "Asia" },
|
|
134
|
+
{ id: "MG", label: "Madagascar", group: "Africa" },
|
|
135
|
+
{ id: "MW", label: "Malawi", group: "Africa" },
|
|
136
|
+
{ id: "MY", label: "Malaysia", group: "Asia" },
|
|
137
|
+
{ id: "MV", label: "Maldives", group: "Asia" },
|
|
138
|
+
{ id: "ML", label: "Mali", group: "Africa" },
|
|
139
|
+
{ id: "MT", label: "Malta", group: "Europe" },
|
|
140
|
+
{ id: "MH", label: "Marshall Islands", group: "Oceania" },
|
|
141
|
+
{ id: "MQ", label: "Martinique", group: "Americas" },
|
|
142
|
+
{ id: "MR", label: "Mauritania", group: "Africa" },
|
|
143
|
+
{ id: "MU", label: "Mauritius", group: "Africa" },
|
|
144
|
+
{ id: "YT", label: "Mayotte", group: "Africa" },
|
|
145
|
+
{ id: "MX", label: "Mexico", group: "Americas" },
|
|
146
|
+
{ id: "FM", label: "Micronesia, Federated States of", group: "Oceania" },
|
|
147
|
+
{ id: "MD", label: "Moldova, Republic of", group: "Europe" },
|
|
148
|
+
{ id: "MC", label: "Monaco", group: "Europe" },
|
|
149
|
+
{ id: "MN", label: "Mongolia", group: "Asia" },
|
|
150
|
+
{ id: "ME", label: "Montenegro", group: "Europe" },
|
|
151
|
+
{ id: "MS", label: "Montserrat", group: "Americas" },
|
|
152
|
+
{ id: "MA", label: "Morocco", group: "Africa" },
|
|
153
|
+
{ id: "MZ", label: "Mozambique", group: "Africa" },
|
|
154
|
+
{ id: "MM", label: "Myanmar", group: "Asia" },
|
|
155
|
+
{ id: "NA", label: "Namibia", group: "Africa" },
|
|
156
|
+
{ id: "NR", label: "Nauru", group: "Oceania" },
|
|
157
|
+
{ id: "NP", label: "Nepal", group: "Asia" },
|
|
158
|
+
{ id: "NL", label: "Netherlands, Kingdom of the", group: "Europe" },
|
|
159
|
+
{ id: "NC", label: "New Caledonia", group: "Oceania" },
|
|
160
|
+
{ id: "NZ", label: "New Zealand", group: "Oceania" },
|
|
161
|
+
{ id: "NI", label: "Nicaragua", group: "Americas" },
|
|
162
|
+
{ id: "NE", label: "Niger", group: "Africa" },
|
|
163
|
+
{ id: "NG", label: "Nigeria", group: "Africa" },
|
|
164
|
+
{ id: "NU", label: "Niue", group: "Oceania" },
|
|
165
|
+
{ id: "NF", label: "Norfolk Island", group: "Oceania" },
|
|
166
|
+
{ id: "MK", label: "North Macedonia", group: "Europe" },
|
|
167
|
+
{ id: "MP", label: "Northern Mariana Islands", group: "Oceania" },
|
|
168
|
+
{ id: "NO", label: "Norway", group: "Europe" },
|
|
169
|
+
{ id: "OM", label: "Oman", group: "Asia" },
|
|
170
|
+
{ id: "PK", label: "Pakistan", group: "Asia" },
|
|
171
|
+
{ id: "PW", label: "Palau", group: "Oceania" },
|
|
172
|
+
{ id: "PS", label: "Palestine, State of", group: "Asia" },
|
|
173
|
+
{ id: "PA", label: "Panama", group: "Americas" },
|
|
174
|
+
{ id: "PG", label: "Papua New Guinea", group: "Oceania" },
|
|
175
|
+
{ id: "PY", label: "Paraguay", group: "Americas" },
|
|
176
|
+
{ id: "PE", label: "Peru", group: "Americas" },
|
|
177
|
+
{ id: "PH", label: "Philippines", group: "Asia" },
|
|
178
|
+
{ id: "PN", label: "Pitcairn", group: "Oceania" },
|
|
179
|
+
{ id: "PL", label: "Poland", group: "Europe" },
|
|
180
|
+
{ id: "PT", label: "Portugal", group: "Europe" },
|
|
181
|
+
{ id: "PR", label: "Puerto Rico", group: "Americas" },
|
|
182
|
+
{ id: "QA", label: "Qatar", group: "Asia" },
|
|
183
|
+
{ id: "RE", label: "Réunion", group: "Africa" },
|
|
184
|
+
{ id: "RO", label: "Romania", group: "Europe" },
|
|
185
|
+
{ id: "RU", label: "Russian Federation", group: "Europe" },
|
|
186
|
+
{ id: "RW", label: "Rwanda", group: "Africa" },
|
|
187
|
+
{ id: "BL", label: "Saint Barthélemy", group: "Americas" },
|
|
188
|
+
{
|
|
189
|
+
id: "SH",
|
|
190
|
+
label: "Saint Helena, Ascension and Tristan da Cunha",
|
|
191
|
+
group: "Africa",
|
|
192
|
+
},
|
|
193
|
+
{ id: "KN", label: "Saint Kitts and Nevis", group: "Americas" },
|
|
194
|
+
{ id: "LC", label: "Saint Lucia", group: "Americas" },
|
|
195
|
+
{ id: "MF", label: "Saint Martin (French part)", group: "Americas" },
|
|
196
|
+
{ id: "PM", label: "Saint Pierre and Miquelon", group: "Americas" },
|
|
197
|
+
{ id: "VC", label: "Saint Vincent and the Grenadines", group: "Americas" },
|
|
198
|
+
{ id: "WS", label: "Samoa", group: "Oceania" },
|
|
199
|
+
{ id: "SM", label: "San Marino", group: "Europe" },
|
|
200
|
+
{ id: "ST", label: "Sao Tome and Principe", group: "Africa" },
|
|
201
|
+
{ id: "SA", label: "Saudi Arabia", group: "Asia" },
|
|
202
|
+
{ id: "SN", label: "Senegal", group: "Africa" },
|
|
203
|
+
{ id: "RS", label: "Serbia", group: "Europe" },
|
|
204
|
+
{ id: "SC", label: "Seychelles", group: "Africa" },
|
|
205
|
+
{ id: "SL", label: "Sierra Leone", group: "Africa" },
|
|
206
|
+
{ id: "SG", label: "Singapore", group: "Asia" },
|
|
207
|
+
{ id: "SX", label: "Sint Maarten (Dutch part)", group: "Americas" },
|
|
208
|
+
{ id: "SK", label: "Slovakia", group: "Europe" },
|
|
209
|
+
{ id: "SI", label: "Slovenia", group: "Europe" },
|
|
210
|
+
{ id: "SB", label: "Solomon Islands", group: "Oceania" },
|
|
211
|
+
{ id: "SO", label: "Somalia", group: "Africa" },
|
|
212
|
+
{ id: "ZA", label: "South Africa", group: "Africa" },
|
|
213
|
+
{
|
|
214
|
+
id: "GS",
|
|
215
|
+
label: "South Georgia and the South Sandwich Islands",
|
|
216
|
+
group: "Americas",
|
|
217
|
+
},
|
|
218
|
+
{ id: "SS", label: "South Sudan", group: "Africa" },
|
|
219
|
+
{ id: "ES", label: "Spain", group: "Europe" },
|
|
220
|
+
{ id: "LK", label: "Sri Lanka", group: "Asia" },
|
|
221
|
+
{ id: "SD", label: "Sudan", group: "Africa" },
|
|
222
|
+
{ id: "SR", label: "Suriname", group: "Americas" },
|
|
223
|
+
{ id: "SJ", label: "Svalbard and Jan Mayen", group: "Europe" },
|
|
224
|
+
{ id: "SE", label: "Sweden", group: "Europe" },
|
|
225
|
+
{ id: "CH", label: "Switzerland", group: "Europe" },
|
|
226
|
+
{ id: "SY", label: "Syrian Arab Republic", group: "Asia" },
|
|
227
|
+
{ id: "TW", label: "Taiwan, Province of China", group: "" },
|
|
228
|
+
{ id: "TJ", label: "Tajikistan", group: "Asia" },
|
|
229
|
+
{ id: "TZ", label: "Tanzania, United Republic of", group: "Africa" },
|
|
230
|
+
{ id: "TH", label: "Thailand", group: "Asia" },
|
|
231
|
+
{ id: "TL", label: "Timor-Leste", group: "Asia" },
|
|
232
|
+
{ id: "TG", label: "Togo", group: "Africa" },
|
|
233
|
+
{ id: "TK", label: "Tokelau", group: "Oceania" },
|
|
234
|
+
{ id: "TO", label: "Tonga", group: "Oceania" },
|
|
235
|
+
{ id: "TT", label: "Trinidad and Tobago", group: "Americas" },
|
|
236
|
+
{ id: "TN", label: "Tunisia", group: "Africa" },
|
|
237
|
+
{ id: "TR", label: "Türkiye", group: "Asia" },
|
|
238
|
+
{ id: "TM", label: "Turkmenistan", group: "Asia" },
|
|
239
|
+
{ id: "TC", label: "Turks and Caicos Islands", group: "Americas" },
|
|
240
|
+
{ id: "TV", label: "Tuvalu", group: "Oceania" },
|
|
241
|
+
{ id: "UG", label: "Uganda", group: "Africa" },
|
|
242
|
+
{ id: "UA", label: "Ukraine", group: "Europe" },
|
|
243
|
+
{ id: "AE", label: "United Arab Emirates", group: "Asia" },
|
|
244
|
+
{
|
|
245
|
+
id: "GB",
|
|
246
|
+
label: "United Kingdom of Great Britain and Northern Ireland",
|
|
247
|
+
group: "Europe",
|
|
248
|
+
},
|
|
249
|
+
{ id: "US", label: "United States of America", group: "Americas" },
|
|
250
|
+
{ id: "UM", label: "United States Minor Outlying Islands", group: "Oceania" },
|
|
251
|
+
{ id: "UY", label: "Uruguay", group: "Americas" },
|
|
252
|
+
{ id: "UZ", label: "Uzbekistan", group: "Asia" },
|
|
253
|
+
{ id: "VU", label: "Vanuatu", group: "Oceania" },
|
|
254
|
+
{ id: "VE", label: "Venezuela, Bolivarian Republic of", group: "Americas" },
|
|
255
|
+
{ id: "VN", label: "Viet Nam", group: "Asia" },
|
|
256
|
+
{ id: "VG", label: "Virgin Islands (British)", group: "Americas" },
|
|
257
|
+
{ id: "VI", label: "Virgin Islands (U.S.)", group: "Americas" },
|
|
258
|
+
{ id: "WF", label: "Wallis and Futuna", group: "Oceania" },
|
|
259
|
+
{ id: "EH", label: "Western Sahara", group: "Africa" },
|
|
260
|
+
{ id: "YE", label: "Yemen", group: "Asia" },
|
|
261
|
+
{ id: "ZM", label: "Zambia", group: "Africa" },
|
|
262
|
+
{ id: "ZW", label: "Zimbabwe", group: "Africa" },
|
|
263
|
+
];
|
|
@@ -49,19 +49,49 @@
|
|
|
49
49
|
let baseurl = "//www.ons.gov.uk";
|
|
50
50
|
|
|
51
51
|
function hasCookiesPreferencesSet() {
|
|
52
|
-
return -1 < document.cookie.indexOf("
|
|
52
|
+
return -1 < document.cookie.indexOf("ons_cookie_preferences_set=true");
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// extractValue extracts the value from a undecodeable json cookie string
|
|
56
|
+
function extractValue(key, extractionString) {
|
|
57
|
+
const extractionRegex = new RegExp(`'${key}':(.*?)[,}]`);
|
|
58
|
+
const match = extractionString.match(extractionRegex);
|
|
59
|
+
if (match) {
|
|
60
|
+
return match[1];
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return null;
|
|
53
64
|
}
|
|
54
65
|
|
|
55
66
|
// Check if usage cookies are allowed (for Google Analytics + Hotjar)
|
|
67
|
+
// note: this ported function returns the inverse truth value to the dp-renderer code that it's based on
|
|
68
|
+
// ----------------------
|
|
69
|
+
// getUsageCookieValue reads the legacy cookies_policy and ons_cookies_policy to determine the user's usage preference.
|
|
70
|
+
// The legacy policy takes precedence over the new policy. When no policy is found, the user is opted out by default.
|
|
56
71
|
function getUsageCookieValue() {
|
|
57
|
-
|
|
72
|
+
// TODO: this is the legacy cookie (cookies_policy) handling and will be removed in due course
|
|
73
|
+
var legacyPolicyCookie = document.cookie.match(
|
|
58
74
|
new RegExp("(^|;) ?cookies_policy=([^;]*)(;|$)")
|
|
59
75
|
);
|
|
60
|
-
if (
|
|
61
|
-
|
|
76
|
+
if (legacyPolicyCookie) {
|
|
77
|
+
console.debug("legacy cookies_policy found");
|
|
78
|
+
var decodedCookie = decodeURIComponent(legacyPolicyCookie[2]);
|
|
62
79
|
var cookieValue = JSON.parse(decodedCookie);
|
|
80
|
+
console.debug("usage is", cookieValue.usage);
|
|
63
81
|
return cookieValue.usage;
|
|
64
82
|
}
|
|
83
|
+
|
|
84
|
+
// ons_cookie_policy handler
|
|
85
|
+
var policyCookie = document.cookie.match("(?:^|; )ons_cookie_policy=({.*?})");
|
|
86
|
+
if (policyCookie) {
|
|
87
|
+
console.debug("ons_cookie_policy found");
|
|
88
|
+
|
|
89
|
+
var usageValue = extractValue("usage", policyCookie[1]);
|
|
90
|
+
console.debug("usage is", usageValue);
|
|
91
|
+
|
|
92
|
+
return usageValue === "true";
|
|
93
|
+
}
|
|
94
|
+
console.debug("no cookie found - opting out");
|
|
65
95
|
return false;
|
|
66
96
|
}
|
|
67
97
|
|
|
@@ -70,13 +100,13 @@
|
|
|
70
100
|
let oneYearInSeconds = 60 * 60 * 24 * 365;
|
|
71
101
|
let cookiesDomain = window.location.hostname;
|
|
72
102
|
let cookiesPreference = !0;
|
|
73
|
-
let
|
|
74
|
-
|
|
75
|
-
|
|
103
|
+
let acceptAllCookiesPolicy = `{'essential':true,'settings':true,'usage':true,'campaigns':true}`;
|
|
104
|
+
let rejectAllCookiesPolicy = `{'essential':true,'settings':false,'usage':false,'campaigns':false}`;
|
|
105
|
+
let cookiesPolicy = option == "all" ? acceptAllCookiesPolicy : rejectAllCookiesPolicy;
|
|
76
106
|
let cookiesPath = "/";
|
|
77
107
|
|
|
78
|
-
document.cookie = `
|
|
79
|
-
document.cookie = `
|
|
108
|
+
document.cookie = `ons_cookie_message_displayed=${cookiesPreference};max-age=${oneYearInSeconds};domain=${cookiesDomain};path=${cookiesPath};`;
|
|
109
|
+
document.cookie = `ons_cookies_policy=${cookiesPolicy};max-age=${oneYearInSeconds};domain=${cookiesDomain};path=${cookiesPath};`;
|
|
80
110
|
|
|
81
111
|
message = `You have ${option == "all" ? "accepted" : "rejected"} all additional cookies.`;
|
|
82
112
|
if (option == "all") usageCookies = true;
|
|
@@ -154,6 +184,7 @@
|
|
|
154
184
|
"change your cookie preferences": "newid eich dewisiadau o ran cwcis",
|
|
155
185
|
"at any time.": "ar unrhyw adeg.",
|
|
156
186
|
Hide: "Cuddio",
|
|
187
|
+
"Hide this message": "Cuddiwch y neges yma",
|
|
157
188
|
};
|
|
158
189
|
const i18n = (text) => (lang == "cy" && texts[text] ? texts[text] : text);
|
|
159
190
|
</script>
|
|
@@ -250,6 +281,7 @@
|
|
|
250
281
|
<button
|
|
251
282
|
type="button"
|
|
252
283
|
class="ons-btn ons-btn--secondary ons-btn--small ons-js-hide-button"
|
|
284
|
+
aria-label="{i18n('Hide this message')}"
|
|
253
285
|
on:click="{() => (showBanner = false)}"
|
|
254
286
|
>
|
|
255
287
|
<span class="ons-btn__inner"><span class="ons-btn__text">{i18n("Hide")}</span> </span>
|