@nationalarchives/frontend 0.1.23-prerelease → 0.1.25-prerelease

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.
Files changed (159) hide show
  1. package/README.md +22 -0
  2. package/govuk-prototype-kit.config.json +4 -12
  3. package/nationalarchives/all.css +2 -2
  4. package/nationalarchives/all.css.map +1 -1
  5. package/nationalarchives/all.js +1 -1
  6. package/nationalarchives/all.js.map +1 -1
  7. package/nationalarchives/assets/fonts/OpenSans-Regular.ttf +0 -0
  8. package/nationalarchives/assets/fonts/RobotoMono-Medium.ttf +0 -0
  9. package/nationalarchives/components/_index.scss +1 -1
  10. package/nationalarchives/components/breadcrumbs/breadcrumbs.css +1 -1
  11. package/nationalarchives/components/breadcrumbs/breadcrumbs.css.map +1 -1
  12. package/nationalarchives/components/breadcrumbs/breadcrumbs.stories.js +1 -1
  13. package/nationalarchives/components/button/button.css +1 -1
  14. package/nationalarchives/components/button/button.css.map +1 -1
  15. package/nationalarchives/components/button/button.scss +12 -12
  16. package/nationalarchives/components/button/template.njk +2 -2
  17. package/nationalarchives/components/card/card.css +1 -1
  18. package/nationalarchives/components/card/card.css.map +1 -1
  19. package/nationalarchives/components/card/card.scss +9 -4
  20. package/nationalarchives/components/card/card.stories.js +27 -78
  21. package/nationalarchives/components/card/fixtures.json +17 -17
  22. package/nationalarchives/components/card/macro-options.json +47 -17
  23. package/nationalarchives/components/card/template.njk +47 -46
  24. package/nationalarchives/components/cookie-banner/cookie-banner.css +1 -1
  25. package/nationalarchives/components/cookie-banner/cookie-banner.css.map +1 -1
  26. package/nationalarchives/components/cookie-banner/cookie-banner.js +1 -1
  27. package/nationalarchives/components/cookie-banner/cookie-banner.js.map +1 -1
  28. package/nationalarchives/components/cookie-banner/cookie-banner.mjs +17 -16
  29. package/nationalarchives/components/cookie-banner/cookie-banner.scss +1 -1
  30. package/nationalarchives/components/cookie-banner/cookie-banner.stories.js +95 -45
  31. package/nationalarchives/components/cookie-banner/fixtures.json +84 -1
  32. package/nationalarchives/components/cookie-banner/macro-options.json +7 -1
  33. package/nationalarchives/components/cookie-banner/template.njk +4 -4
  34. package/nationalarchives/components/featured-records/_index.scss +1 -0
  35. package/nationalarchives/components/featured-records/featured-records.css +1 -0
  36. package/nationalarchives/components/featured-records/featured-records.css.map +1 -0
  37. package/nationalarchives/components/featured-records/featured-records.scss +95 -0
  38. package/nationalarchives/components/featured-records/featured-records.stories.js +51 -0
  39. package/nationalarchives/components/featured-records/fixtures.json +4 -0
  40. package/nationalarchives/components/featured-records/macro-options.json +70 -0
  41. package/nationalarchives/components/featured-records/macro.njk +3 -0
  42. package/nationalarchives/components/featured-records/template.njk +20 -0
  43. package/nationalarchives/components/filters/filters.css +1 -1
  44. package/nationalarchives/components/filters/filters.css.map +1 -1
  45. package/nationalarchives/components/filters/filters.scss +6 -6
  46. package/nationalarchives/components/filters/template.njk +1 -1
  47. package/nationalarchives/components/footer/footer.css +1 -1
  48. package/nationalarchives/components/footer/footer.css.map +1 -1
  49. package/nationalarchives/components/footer/footer.scss +2 -5
  50. package/nationalarchives/components/footer/footer.stories.js +1 -1
  51. package/nationalarchives/components/footer/template.njk +4 -4
  52. package/nationalarchives/components/gallery/gallery.css +1 -1
  53. package/nationalarchives/components/gallery/gallery.css.map +1 -1
  54. package/nationalarchives/components/gallery/gallery.scss +2 -2
  55. package/nationalarchives/components/gallery/gallery.stories.js +2 -2
  56. package/nationalarchives/components/grid/grid.css +1 -1
  57. package/nationalarchives/components/grid/grid.css.map +1 -1
  58. package/nationalarchives/components/grid/grid.scss +12 -0
  59. package/nationalarchives/components/grid/grid.stories.js +12 -0
  60. package/nationalarchives/components/header/header.css +1 -1
  61. package/nationalarchives/components/header/header.css.map +1 -1
  62. package/nationalarchives/components/header/header.scss +59 -27
  63. package/nationalarchives/components/header/header.stories.js +4 -6
  64. package/nationalarchives/components/header/macro-options.json +2 -2
  65. package/nationalarchives/components/header/template.njk +4 -4
  66. package/nationalarchives/components/hero/hero.css +1 -1
  67. package/nationalarchives/components/hero/hero.css.map +1 -1
  68. package/nationalarchives/components/hero/hero.scss +6 -6
  69. package/nationalarchives/components/hero/hero.stories.js +6 -0
  70. package/nationalarchives/components/index-grid/index-grid.css +1 -1
  71. package/nationalarchives/components/index-grid/index-grid.css.map +1 -1
  72. package/nationalarchives/components/index-grid/index-grid.scss +1 -1
  73. package/nationalarchives/components/index-grid/index-grid.stories.js +3 -1
  74. package/nationalarchives/components/message/message.css +1 -1
  75. package/nationalarchives/components/message/message.css.map +1 -1
  76. package/nationalarchives/components/pagination/macro-options.json +6 -0
  77. package/nationalarchives/components/pagination/pagination.css +1 -1
  78. package/nationalarchives/components/pagination/pagination.css.map +1 -1
  79. package/nationalarchives/components/pagination/pagination.scss +5 -1
  80. package/nationalarchives/components/pagination/pagination.stories.js +417 -2
  81. package/nationalarchives/components/pagination/template.njk +10 -3
  82. package/nationalarchives/components/phase-banner/fixtures.json +5 -41
  83. package/nationalarchives/components/phase-banner/macro-options.json +6 -0
  84. package/nationalarchives/components/phase-banner/phase-banner.css +1 -1
  85. package/nationalarchives/components/phase-banner/phase-banner.css.map +1 -1
  86. package/nationalarchives/components/phase-banner/phase-banner.scss +1 -1
  87. package/nationalarchives/components/phase-banner/phase-banner.stories.js +4 -28
  88. package/nationalarchives/components/phase-banner/template.njk +3 -1
  89. package/nationalarchives/components/picture/picture.css +1 -1
  90. package/nationalarchives/components/picture/picture.css.map +1 -1
  91. package/nationalarchives/components/picture/picture.scss +5 -4
  92. package/nationalarchives/components/sensitive-image/sensitive-image.css +1 -1
  93. package/nationalarchives/components/sensitive-image/sensitive-image.css.map +1 -1
  94. package/nationalarchives/components/sensitive-image/sensitive-image.stories.js +3 -0
  95. package/nationalarchives/components/skip-link/skip-link.css +1 -1
  96. package/nationalarchives/components/skip-link/skip-link.css.map +1 -1
  97. package/nationalarchives/components/skip-link/skip-link.stories.js +4 -1
  98. package/nationalarchives/components/tabs/tabs.css +1 -1
  99. package/nationalarchives/components/tabs/tabs.css.map +1 -1
  100. package/nationalarchives/components/tabs/tabs.js +1 -1
  101. package/nationalarchives/components/tabs/tabs.js.map +1 -1
  102. package/nationalarchives/components/tabs/tabs.mjs +0 -4
  103. package/nationalarchives/components/tabs/tabs.stories.js +6 -3
  104. package/nationalarchives/lib/cookies.mjs +165 -62
  105. package/nationalarchives/prototype-kit.css +23 -0
  106. package/nationalarchives/prototype-kit.css.map +1 -0
  107. package/nationalarchives/{_prototype-kit.scss → prototype-kit.scss} +3 -3
  108. package/nationalarchives/stories/utilities/colour-schemes/colour-schemes.stories.js +189 -74
  109. package/nationalarchives/stories/utilities/lists/lists.mdx +18 -0
  110. package/nationalarchives/stories/utilities/{typography → lists}/lists.stories.js +1 -1
  111. package/nationalarchives/stories/utilities/overrides/overrides.mdx +27 -20
  112. package/nationalarchives/stories/utilities/overrides/overrides.stories.js +19 -2
  113. package/nationalarchives/stories/utilities/tables/tables.mdx +8 -0
  114. package/nationalarchives/stories/utilities/tables/tables.stories.js +45 -0
  115. package/nationalarchives/stories/utilities/typography/heading-groups.stories.js +59 -19
  116. package/nationalarchives/stories/utilities/typography/typography.mdx +3 -25
  117. package/nationalarchives/stories/utilities/typography/typography.stories.js +28 -2
  118. package/nationalarchives/templates/layouts/_generic.njk +1 -0
  119. package/nationalarchives/templates/layouts/_prototype-kit.njk +4 -1
  120. package/nationalarchives/tests/cookies.test.js +427 -0
  121. package/nationalarchives/tests/uuid.test.js +17 -0
  122. package/nationalarchives/tools/_colour.scss +15 -20
  123. package/nationalarchives/tools/_spacing.scss +91 -2
  124. package/nationalarchives/tools/_typography.scss +15 -8
  125. package/nationalarchives/utilities/_a11y.scss +2 -1
  126. package/nationalarchives/utilities/_colour.scss +100 -0
  127. package/nationalarchives/utilities/_global.scss +2 -98
  128. package/nationalarchives/utilities/_index.scss +2 -0
  129. package/nationalarchives/utilities/_lists.scss +5 -0
  130. package/nationalarchives/utilities/_overrides.scss +16 -36
  131. package/nationalarchives/utilities/_tables.scss +86 -0
  132. package/nationalarchives/utilities/_typography.scss +150 -71
  133. package/nationalarchives/variables/_colour.scss +10 -8
  134. package/nationalarchives/variables/_spacing.scss +14 -9
  135. package/nationalarchives/variables/_typography.scss +10 -7
  136. package/package.json +14 -14
  137. package/nationalarchives/assets/fonts/OpenSans-Medium.ttf +0 -0
  138. package/nationalarchives/assets/fonts/fa-regular-400.ttf +0 -0
  139. package/nationalarchives/assets/fonts/fa-regular-400.woff2 +0 -0
  140. package/nationalarchives/components/profile/_index.scss +0 -1
  141. package/nationalarchives/components/profile/fixtures.json +0 -4
  142. package/nationalarchives/components/profile/macro-options.json +0 -14
  143. package/nationalarchives/components/profile/macro.njk +0 -3
  144. package/nationalarchives/components/profile/profile.css +0 -1
  145. package/nationalarchives/components/profile/profile.css.map +0 -1
  146. package/nationalarchives/components/profile/profile.scss +0 -5
  147. package/nationalarchives/components/profile/profile.stories.js +0 -31
  148. package/nationalarchives/components/profile/template.njk +0 -15
  149. package/nationalarchives/lib/font-awesome/regular.css +0 -5
  150. package/nationalarchives/lib/font-awesome/regular.css.map +0 -1
  151. package/nationalarchives/lib/font-awesome/regular.scss +0 -28
  152. package/nationalarchives/stories/development/about.mdx +0 -122
  153. package/nationalarchives/stories/development/contributing.mdx +0 -32
  154. package/nationalarchives/stories/development/cookies.mdx +0 -82
  155. package/nationalarchives/stories/development/publishing.mdx +0 -15
  156. package/nationalarchives/stories/development/structure.mdx +0 -88
  157. package/nationalarchives/stories/development/using/compiled.mdx +0 -9
  158. package/nationalarchives/stories/development/using/hosted.mdx +0 -53
  159. package/nationalarchives/stories/development/using/npm.mdx +0 -59
@@ -1,3 +1,35 @@
1
+ export class CookieEventHandler {
2
+ events = {};
3
+
4
+ constructor() {
5
+ if (CookieEventHandler._instance) {
6
+ return CookieEventHandler._instance;
7
+ }
8
+ CookieEventHandler._instance = this;
9
+ }
10
+
11
+ /**
12
+ * Add an event listener.
13
+ * @param {string} event - The event to add a listener for.
14
+ * @param {function} callback - The callback function to call when the event is triggered.
15
+ */
16
+ on(event, callback) {
17
+ if (!Object.prototype.hasOwnProperty.call(this.events, event)) {
18
+ this.events[event] = [];
19
+ }
20
+ this.events[event] = [...this.events[event], callback];
21
+ }
22
+
23
+ /** @protected */
24
+ trigger(event, data = {}) {
25
+ if (Object.prototype.hasOwnProperty.call(this.events, event)) {
26
+ this.events[event].forEach((eventToTrigger) =>
27
+ eventToTrigger.call(this, data),
28
+ );
29
+ }
30
+ }
31
+ }
32
+
1
33
  /**
2
34
  * Class to handle cookies.
3
35
  * @class Cookies
@@ -6,49 +38,68 @@
6
38
  */
7
39
  export default class Cookies {
8
40
  /** @protected */
9
- #policies = {};
41
+ extraPolicies = [];
42
+ /** @protected */
43
+ domain = "";
44
+ /** @protected */
45
+ secure = true;
46
+ /** @protected */
47
+ policiesKey = "";
10
48
 
11
49
  /**
12
50
  * Create a cookie handler.
13
- * @param {string[]} [policies=usage,settings] - The cookie policies to manage.
14
- * @param {string} [cookiesPolicyKey=cookies_policy] - The name of the cookie.
15
- */
16
- constructor(
17
- policies = ["usage", "settings"],
18
- cookiesPolicyKey = "cookies_policy",
19
- ) {
20
- this.cookiesPolicyKey = cookiesPolicyKey;
21
- policies.forEach((policy) => {
22
- this.#policies[policy.toLowerCase()] = false;
23
- });
24
- this.#policies.essential = true;
25
- }
26
-
27
- get policies() {
28
- return this.exists(this.cookiesPolicyKey)
29
- ? (this.#policies = {
30
- ...this.#policies,
31
- ...this.allPolicies,
32
- })
33
- : this.#policies;
51
+ * @param {string[]} [extraPolicies=[]] - The extra cookie policies to manage in addition to essential, settings and usage.
52
+ * @param {string} [options.domain=""] - The domain to register the cookie with.
53
+ * @param {string} [options.secure=true] - Only set cookie in HTTPS environments.
54
+ * @param {string} [options.policiesKey=cookies_policy] - The name of the cookie.
55
+ */
56
+ constructor(extraPolicies = [], options = {}) {
57
+ const {
58
+ domain = "",
59
+ secure = true,
60
+ policiesKey = "cookies_policy",
61
+ } = options;
62
+ this.extraPolicies = extraPolicies;
63
+ this.domain = domain;
64
+ this.secure = secure;
65
+ this.policiesKey = policiesKey;
66
+ this.events = new CookieEventHandler();
67
+ this.init();
34
68
  }
35
69
 
36
- set policies(newPolicyValues) {
37
- this.#policies = newPolicyValues;
70
+ /** @protected */
71
+ init() {
72
+ this.savePolicies({
73
+ ...Object.fromEntries(
74
+ this.extraPolicies.map((k) => [k.toLowerCase(), false]),
75
+ ),
76
+ usage: false,
77
+ settings: false,
78
+ ...this.policies,
79
+ essential: true,
80
+ });
38
81
  }
39
82
 
40
- /** @protected */
41
- #deserialise(cookieString) {
83
+ get all() {
42
84
  const deserialised = {};
43
- cookieString.split(";").forEach((cookie) => {
44
- const parts = cookie.trim().split("=");
45
- deserialised[parts[0]] = parts[1];
46
- });
85
+ document.cookie
86
+ .split("; ")
87
+ .filter((x) => x)
88
+ .forEach((cookie) => {
89
+ const parts = cookie.trim().split("=");
90
+ if (parts[0]) {
91
+ deserialised[parts[0]] = parts[1];
92
+ }
93
+ });
47
94
  return deserialised;
48
95
  }
49
96
 
50
- get all() {
51
- return this.#deserialise(document.cookie);
97
+ get policies() {
98
+ try {
99
+ return JSON.parse(this.get(this.policiesKey) || "{}");
100
+ } catch (e) {
101
+ return {};
102
+ }
52
103
  }
53
104
 
54
105
  /**
@@ -87,16 +138,36 @@ export default class Cookies {
87
138
  * @param {number} [options.maxAge=31536000] - The maximum age of the cookie in seconds.
88
139
  * @param {string} [options.path=/] - The path to register the cookie for.
89
140
  * @param {string} [options.sameSite=Lax] - The sameSite attribute.
141
+ * @param {string} [options.domain=this.domain] - The domain to register the cookie with.
142
+ * @param {string} [options.secure=this.secure] - Only set cookie in HTTPS environments.
90
143
  */
91
144
  set(key, value, options = {}) {
92
145
  const {
93
146
  maxAge = 60 * 60 * 24 * 365,
94
147
  path = "/",
95
148
  sameSite = "Lax",
149
+ domain = this.domain,
150
+ secure = this.secure,
96
151
  } = options;
97
- document.cookie = `${encodeURIComponent(key)}=${encodeURIComponent(
152
+ if (!key) {
153
+ return;
154
+ }
155
+ const cookie = `${encodeURIComponent(key)}=${encodeURIComponent(value)};${
156
+ domain ? ` domain=${domain}; ` : ""
157
+ } samesite=${sameSite}; path=${path}; max-age=${maxAge}${
158
+ secure ? "; secure" : ""
159
+ }`;
160
+ document.cookie = cookie;
161
+ this.events.trigger("setCookie", {
162
+ key,
98
163
  value,
99
- )}; SameSite=${sameSite}; path=${path}; max-age=${maxAge}; Secure`;
164
+ maxAge,
165
+ path,
166
+ sameSite,
167
+ domain,
168
+ secure,
169
+ cookie,
170
+ });
100
171
  }
101
172
 
102
173
  /**
@@ -104,12 +175,20 @@ export default class Cookies {
104
175
  * @param {string} key - The cookie name.
105
176
  * @param {string} [path=/] - The path to the cookie is registered on.
106
177
  */
107
- delete(key, path = "/") {
108
- this.set(key, "", 0, path);
178
+ delete(key, path = "/", domain = null) {
179
+ const options = { maxAge: -1, path, domain: domain || undefined };
180
+ this.set(key, "", options);
181
+ this.events.trigger("deleteCookie", { key, ...options });
109
182
  }
110
183
 
111
- get allPolicies() {
112
- return JSON.parse(this.get(this.cookiesPolicyKey) || "{}");
184
+ /**
185
+ * Delete all cookies.
186
+ */
187
+ deleteAll(path = "/", domain = null) {
188
+ Object.keys(this.all).forEach((cookie) => {
189
+ this.delete(cookie, path, domain);
190
+ });
191
+ this.events.trigger("deleteAllCookies", { path, domain });
113
192
  }
114
193
 
115
194
  /**
@@ -117,8 +196,9 @@ export default class Cookies {
117
196
  * @param {string} policy - The name of the policy.
118
197
  */
119
198
  acceptPolicy(policy) {
120
- this.#setPolicy(policy, true);
121
- this.savePolicies();
199
+ this.setPolicy(policy, true);
200
+ this.events.trigger("acceptPolicy", policy);
201
+ this.events.trigger("changePolicy", { [policy]: true });
122
202
  }
123
203
 
124
204
  /**
@@ -126,47 +206,61 @@ export default class Cookies {
126
206
  * @param {string} policy - The name of the policy.
127
207
  */
128
208
  rejectPolicy(policy) {
209
+ this.setPolicy(policy, false);
210
+ this.events.trigger("rejectPolicy", policy);
211
+ this.events.trigger("changePolicy", { [policy]: false });
212
+ }
213
+
214
+ /**
215
+ * Set a policy.
216
+ * @param {string} policy - The name of the policy.
217
+ * @param {boolean} accepted - Whether the policy is accepted or not.
218
+ */
219
+ setPolicy(policy, accepted) {
129
220
  if (policy === "essential") {
130
221
  return;
131
222
  }
132
- this.#setPolicy(policy, false);
133
- this.savePolicies();
134
- }
135
-
136
- /** @protected */
137
- #setPolicy(policy, accepted) {
138
- this.policies = {
223
+ this.savePolicies({
139
224
  ...this.policies,
140
225
  [policy]: accepted,
141
226
  essential: true,
142
- };
143
- }
144
-
145
- /**
146
- * Commit the policy preferences to the browser.
147
- */
148
- savePolicies() {
149
- this.set(this.cookiesPolicyKey, JSON.stringify(this.policies));
227
+ });
228
+ this.events.trigger("changePolicy", { [policy]: accepted });
150
229
  }
151
230
 
152
231
  /**
153
232
  * Accept all the cookie policies.
154
233
  */
155
234
  acceptAllPolicies() {
156
- Object.keys(this.policies).forEach((policy) =>
157
- this.#setPolicy(policy, true),
235
+ const allPolicies = Object.fromEntries(
236
+ Object.keys(this.policies).map((k) => [k.toLowerCase(), true]),
158
237
  );
159
- this.savePolicies();
238
+ this.savePolicies(allPolicies);
239
+ this.events.trigger("acceptAllPolicies");
240
+ this.events.trigger("changePolicy", allPolicies);
160
241
  }
161
242
 
162
243
  /**
163
244
  * Reject all the cookie policies.
164
245
  */
165
246
  rejectAllPolicies() {
166
- Object.keys(this.policies).forEach((policy) =>
167
- this.#setPolicy(policy, false),
168
- );
169
- this.savePolicies();
247
+ const allPolicies = {
248
+ ...Object.fromEntries(
249
+ Object.keys(this.policies).map((k) => [k.toLowerCase(), false]),
250
+ ),
251
+ essential: true,
252
+ };
253
+ this.savePolicies(allPolicies);
254
+ this.events.trigger("rejectAllPolicies");
255
+ this.events.trigger("changePolicy", allPolicies);
256
+ }
257
+
258
+ /**
259
+ * Commit policy preferences to the browser.
260
+ * @param {object} policies - The policies to commit.
261
+ */
262
+ savePolicies(policies) {
263
+ this.set(this.policiesKey, JSON.stringify(policies));
170
264
  }
171
265
 
172
266
  /**
@@ -179,4 +273,13 @@ export default class Cookies {
179
273
  ? this.policies[policy] === true
180
274
  : null;
181
275
  }
276
+
277
+ /**
278
+ * Add an event listener.
279
+ * @param {string} event - The event to add a listener for.
280
+ * @param {function} callback - The callback function to call when the event is triggered.
281
+ */
282
+ on(event, callback) {
283
+ this.events.on(event, callback);
284
+ }
182
285
  }