@nationalarchives/frontend 0.1.24-prerelease → 0.1.26-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 (213) 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/all.mjs +0 -11
  8. package/nationalarchives/components/_index.scss +8 -0
  9. package/nationalarchives/components/breadcrumbs/breadcrumbs.css +1 -1
  10. package/nationalarchives/components/breadcrumbs/breadcrumbs.css.map +1 -1
  11. package/nationalarchives/components/breadcrumbs/breadcrumbs.js +1 -1
  12. package/nationalarchives/components/breadcrumbs/breadcrumbs.js.map +1 -1
  13. package/nationalarchives/components/breadcrumbs/breadcrumbs.mjs +1 -1
  14. package/nationalarchives/components/breadcrumbs/breadcrumbs.scss +1 -1
  15. package/nationalarchives/components/breadcrumbs/breadcrumbs.stories.js +1 -1
  16. package/nationalarchives/components/button/_button-group.scss +4 -0
  17. package/nationalarchives/components/button/button.css +1 -1
  18. package/nationalarchives/components/button/button.css.map +1 -1
  19. package/nationalarchives/components/button/button.scss +89 -26
  20. package/nationalarchives/components/button/button.stories.js +52 -5
  21. package/nationalarchives/components/button/macro-options.json +18 -0
  22. package/nationalarchives/components/button/template.njk +15 -6
  23. package/nationalarchives/components/card/card.css +1 -1
  24. package/nationalarchives/components/card/card.css.map +1 -1
  25. package/nationalarchives/components/card/card.scss +7 -37
  26. package/nationalarchives/components/card/card.stories.js +6 -78
  27. package/nationalarchives/components/card/fixtures.json +17 -17
  28. package/nationalarchives/components/card/macro-options.json +41 -17
  29. package/nationalarchives/components/card/template.njk +51 -48
  30. package/nationalarchives/components/checkboxes/_index.scss +1 -0
  31. package/nationalarchives/components/checkboxes/checkboxes.css +1 -0
  32. package/nationalarchives/components/checkboxes/checkboxes.css.map +1 -0
  33. package/nationalarchives/components/checkboxes/checkboxes.scss +143 -0
  34. package/nationalarchives/components/checkboxes/checkboxes.stories.js +238 -0
  35. package/nationalarchives/components/checkboxes/fixtures.json +4 -0
  36. package/nationalarchives/components/checkboxes/macro-options.json +102 -0
  37. package/nationalarchives/components/checkboxes/macro.njk +3 -0
  38. package/nationalarchives/components/checkboxes/template.njk +35 -0
  39. package/nationalarchives/components/cookie-banner/cookie-banner.css +1 -1
  40. package/nationalarchives/components/cookie-banner/cookie-banner.css.map +1 -1
  41. package/nationalarchives/components/cookie-banner/cookie-banner.js +1 -1
  42. package/nationalarchives/components/cookie-banner/cookie-banner.js.map +1 -1
  43. package/nationalarchives/components/cookie-banner/cookie-banner.mjs +19 -16
  44. package/nationalarchives/components/cookie-banner/cookie-banner.stories.js +103 -42
  45. package/nationalarchives/components/cookie-banner/fixtures.json +54 -8
  46. package/nationalarchives/components/cookie-banner/macro-options.json +19 -1
  47. package/nationalarchives/components/cookie-banner/template.njk +1 -1
  48. package/nationalarchives/components/date-input/_index.scss +1 -0
  49. package/nationalarchives/components/date-input/date-input.css +1 -0
  50. package/nationalarchives/components/date-input/date-input.css.map +1 -0
  51. package/nationalarchives/components/date-input/date-input.scss +48 -0
  52. package/nationalarchives/components/date-input/date-input.stories.js +116 -0
  53. package/nationalarchives/components/date-input/fixtures.json +4 -0
  54. package/nationalarchives/components/date-input/macro-options.json +96 -0
  55. package/nationalarchives/components/date-input/macro.njk +3 -0
  56. package/nationalarchives/components/date-input/template.njk +45 -0
  57. package/nationalarchives/components/date-search/_index.scss +1 -0
  58. package/nationalarchives/components/date-search/date-search.css +1 -0
  59. package/nationalarchives/components/date-search/date-search.css.map +1 -0
  60. package/nationalarchives/components/date-search/date-search.scss +27 -0
  61. package/nationalarchives/components/date-search/date-search.stories.js +121 -0
  62. package/nationalarchives/components/date-search/fixtures.json +4 -0
  63. package/nationalarchives/components/date-search/macro-options.json +94 -0
  64. package/nationalarchives/components/date-search/macro.njk +3 -0
  65. package/nationalarchives/components/date-search/template.njk +27 -0
  66. package/nationalarchives/components/featured-records/featured-records.css +1 -1
  67. package/nationalarchives/components/featured-records/featured-records.css.map +1 -1
  68. package/nationalarchives/components/filters/filters.css +1 -1
  69. package/nationalarchives/components/filters/filters.css.map +1 -1
  70. package/nationalarchives/components/filters/filters.scss +0 -8
  71. package/nationalarchives/components/filters/template.njk +2 -2
  72. package/nationalarchives/components/footer/footer.css +1 -1
  73. package/nationalarchives/components/footer/footer.css.map +1 -1
  74. package/nationalarchives/components/footer/footer.scss +3 -5
  75. package/nationalarchives/components/footer/footer.stories.js +1 -1
  76. package/nationalarchives/components/footer/template.njk +13 -9
  77. package/nationalarchives/components/gallery/gallery.css +1 -1
  78. package/nationalarchives/components/gallery/gallery.css.map +1 -1
  79. package/nationalarchives/components/gallery/gallery.scss +0 -11
  80. package/nationalarchives/components/gallery/gallery.stories.js +8 -10
  81. package/nationalarchives/components/gallery/template.njk +1 -1
  82. package/nationalarchives/components/grid/grid.css +1 -1
  83. package/nationalarchives/components/grid/grid.css.map +1 -1
  84. package/nationalarchives/components/grid/grid.scss +12 -0
  85. package/nationalarchives/components/grid/grid.stories.js +12 -0
  86. package/nationalarchives/components/header/header.css +1 -1
  87. package/nationalarchives/components/header/header.css.map +1 -1
  88. package/nationalarchives/components/header/header.scss +36 -41
  89. package/nationalarchives/components/header/header.stories.js +0 -41
  90. package/nationalarchives/components/header/template.njk +3 -3
  91. package/nationalarchives/components/hero/hero.css +1 -1
  92. package/nationalarchives/components/hero/hero.css.map +1 -1
  93. package/nationalarchives/components/hero/hero.scss +3 -7
  94. package/nationalarchives/components/hero/hero.stories.js +6 -0
  95. package/nationalarchives/components/index-grid/fixtures.json +324 -1
  96. package/nationalarchives/components/index-grid/index-grid.css +1 -1
  97. package/nationalarchives/components/index-grid/index-grid.css.map +1 -1
  98. package/nationalarchives/components/index-grid/index-grid.scss +13 -10
  99. package/nationalarchives/components/index-grid/index-grid.stories.js +27 -14
  100. package/nationalarchives/components/index-grid/macro-options.json +34 -29
  101. package/nationalarchives/components/index-grid/template.njk +13 -8
  102. package/nationalarchives/components/message/message.css +1 -1
  103. package/nationalarchives/components/message/message.css.map +1 -1
  104. package/nationalarchives/components/message/message.scss +1 -6
  105. package/nationalarchives/components/message/template.njk +1 -1
  106. package/nationalarchives/components/pagination/macro-options.json +6 -0
  107. package/nationalarchives/components/pagination/pagination.css +1 -1
  108. package/nationalarchives/components/pagination/pagination.css.map +1 -1
  109. package/nationalarchives/components/pagination/pagination.scss +4 -0
  110. package/nationalarchives/components/pagination/pagination.stories.js +63 -2
  111. package/nationalarchives/components/pagination/template.njk +39 -17
  112. package/nationalarchives/components/phase-banner/phase-banner.css +1 -1
  113. package/nationalarchives/components/phase-banner/phase-banner.css.map +1 -1
  114. package/nationalarchives/components/phase-banner/phase-banner.scss +2 -3
  115. package/nationalarchives/components/picture/picture.css +1 -1
  116. package/nationalarchives/components/picture/picture.css.map +1 -1
  117. package/nationalarchives/components/picture/picture.js.map +1 -1
  118. package/nationalarchives/components/picture/picture.mjs +0 -4
  119. package/nationalarchives/components/picture/picture.scss +1 -1
  120. package/nationalarchives/components/picture/template.njk +1 -1
  121. package/nationalarchives/components/radios/_index.scss +1 -0
  122. package/nationalarchives/components/radios/fixtures.json +4 -0
  123. package/nationalarchives/components/radios/macro-options.json +102 -0
  124. package/nationalarchives/components/radios/macro.njk +3 -0
  125. package/nationalarchives/components/radios/radios.css +1 -0
  126. package/nationalarchives/components/radios/radios.css.map +1 -0
  127. package/nationalarchives/components/radios/radios.scss +131 -0
  128. package/nationalarchives/components/radios/radios.stories.js +241 -0
  129. package/nationalarchives/components/radios/template.njk +35 -0
  130. package/nationalarchives/components/search-field/_index.scss +1 -0
  131. package/nationalarchives/components/search-field/fixtures.json +4 -0
  132. package/nationalarchives/components/search-field/macro-options.json +68 -0
  133. package/nationalarchives/components/search-field/macro.njk +3 -0
  134. package/nationalarchives/components/search-field/search-field.css +1 -0
  135. package/nationalarchives/components/search-field/search-field.css.map +1 -0
  136. package/nationalarchives/components/search-field/search-field.scss +32 -0
  137. package/nationalarchives/components/search-field/search-field.stories.js +88 -0
  138. package/nationalarchives/components/search-field/template.njk +32 -0
  139. package/nationalarchives/components/select/_index.scss +1 -0
  140. package/nationalarchives/components/select/fixtures.json +4 -0
  141. package/nationalarchives/components/select/macro-options.json +114 -0
  142. package/nationalarchives/components/select/macro.njk +3 -0
  143. package/nationalarchives/components/select/select.css +1 -0
  144. package/nationalarchives/components/select/select.css.map +1 -0
  145. package/nationalarchives/components/select/select.scss +51 -0
  146. package/nationalarchives/components/select/select.stories.js +194 -0
  147. package/nationalarchives/components/select/template.njk +29 -0
  148. package/nationalarchives/components/sensitive-image/sensitive-image.css +1 -1
  149. package/nationalarchives/components/sensitive-image/sensitive-image.css.map +1 -1
  150. package/nationalarchives/components/sensitive-image/sensitive-image.stories.js +3 -0
  151. package/nationalarchives/components/sensitive-image/template.njk +1 -1
  152. package/nationalarchives/components/skip-link/skip-link.css +1 -1
  153. package/nationalarchives/components/skip-link/skip-link.css.map +1 -1
  154. package/nationalarchives/components/skip-link/skip-link.stories.js +4 -1
  155. package/nationalarchives/components/skip-link/template.njk +1 -1
  156. package/nationalarchives/components/tabs/tabs.css +1 -1
  157. package/nationalarchives/components/tabs/tabs.css.map +1 -1
  158. package/nationalarchives/components/tabs/tabs.js +1 -1
  159. package/nationalarchives/components/tabs/tabs.js.map +1 -1
  160. package/nationalarchives/components/tabs/tabs.mjs +1 -1
  161. package/nationalarchives/components/tabs/tabs.scss +11 -1
  162. package/nationalarchives/components/tabs/tabs.stories.js +6 -3
  163. package/nationalarchives/components/tabs/template.njk +1 -1
  164. package/nationalarchives/components/text-input/_index.scss +1 -0
  165. package/nationalarchives/components/text-input/fixtures.json +4 -0
  166. package/nationalarchives/components/text-input/macro-options.json +118 -0
  167. package/nationalarchives/components/text-input/macro.njk +3 -0
  168. package/nationalarchives/components/text-input/template.njk +30 -0
  169. package/nationalarchives/components/text-input/text-input.css +1 -0
  170. package/nationalarchives/components/text-input/text-input.css.map +1 -0
  171. package/nationalarchives/components/text-input/text-input.scss +44 -0
  172. package/nationalarchives/components/text-input/text-input.stories.js +188 -0
  173. package/nationalarchives/components/textarea/_index.scss +1 -0
  174. package/nationalarchives/components/textarea/fixtures.json +4 -0
  175. package/nationalarchives/components/textarea/macro-options.json +106 -0
  176. package/nationalarchives/components/textarea/macro.njk +3 -0
  177. package/nationalarchives/components/textarea/template.njk +27 -0
  178. package/nationalarchives/components/textarea/textarea.css +1 -0
  179. package/nationalarchives/components/textarea/textarea.css.map +1 -0
  180. package/nationalarchives/components/textarea/textarea.scss +45 -0
  181. package/nationalarchives/components/textarea/textarea.stories.js +127 -0
  182. package/nationalarchives/lib/cookies.mjs +172 -63
  183. package/nationalarchives/prototype-kit.css +2 -2
  184. package/nationalarchives/prototype-kit.css.map +1 -1
  185. package/nationalarchives/prototype-kit.scss +0 -8
  186. package/nationalarchives/stories/utilities/colour-schemes/colour-schemes.stories.js +449 -91
  187. package/nationalarchives/stories/utilities/forms/forms.mdx +117 -0
  188. package/nationalarchives/stories/utilities/overrides/overrides.stories.js +1 -0
  189. package/nationalarchives/stories/utilities/tables/tables.mdx +8 -0
  190. package/nationalarchives/stories/utilities/tables/tables.stories.js +45 -0
  191. package/nationalarchives/stories/utilities/typography/heading-groups.stories.js +59 -19
  192. package/nationalarchives/stories/utilities/typography/typography.stories.js +0 -6
  193. package/nationalarchives/templates/layouts/_generic.njk +1 -1
  194. package/nationalarchives/templates/layouts/_prototype-kit.njk +2 -0
  195. package/nationalarchives/tests/cookies.test.js +427 -0
  196. package/nationalarchives/tests/uuid.test.js +17 -0
  197. package/nationalarchives/tools/_colour.scss +50 -27
  198. package/nationalarchives/tools/_typography.scss +0 -1
  199. package/nationalarchives/utilities/_a11y.scss +6 -2
  200. package/nationalarchives/utilities/_colour.scss +10 -6
  201. package/nationalarchives/utilities/_debug.scss +3 -4
  202. package/nationalarchives/utilities/_forms.scss +93 -0
  203. package/nationalarchives/utilities/_index.scss +2 -0
  204. package/nationalarchives/utilities/_lists.scss +6 -1
  205. package/nationalarchives/utilities/_overrides.scss +1 -1
  206. package/nationalarchives/utilities/_tables.scss +86 -0
  207. package/nationalarchives/utilities/_typography.scss +71 -77
  208. package/nationalarchives/variables/_colour.scss +15 -10
  209. package/nationalarchives/variables/_forms.scss +2 -0
  210. package/nationalarchives/variables/_index.scss +1 -0
  211. package/nationalarchives/variables/_typography.scss +2 -2
  212. package/package.json +19 -19
  213. package/nationalarchives/stories/utilities/overrides/overrides.mdx +0 -53
@@ -0,0 +1,427 @@
1
+ import {
2
+ jest,
3
+ describe,
4
+ expect,
5
+ test,
6
+ beforeEach,
7
+ afterEach,
8
+ } from "@jest/globals";
9
+ import { TextEncoder, TextDecoder, store, options } from "util";
10
+ import Cookies from "../lib/cookies.mjs";
11
+
12
+ global.TextEncoder = TextEncoder;
13
+ global.TextDecoder = TextDecoder;
14
+ global.store = store;
15
+ global.options = options;
16
+
17
+ const addCookiesToDocument = (document) => {
18
+ let _cookies = {};
19
+ document.__defineGetter__("cookie", () => {
20
+ return Object.keys(_cookies)
21
+ .map((key) => `${key}=${_cookies[key]}`)
22
+ .join("; ");
23
+ });
24
+ document.__defineSetter__("cookie", (s) => {
25
+ const keyValue = s.trim().split("=");
26
+ const key = keyValue[0].trim();
27
+ const values = keyValue[1].trim().split(";");
28
+ const value = values[0];
29
+ _cookies[key] = value;
30
+ return `${key}=${value}`;
31
+ });
32
+ document.clearAllCookies = () => {
33
+ _cookies = {};
34
+ };
35
+ };
36
+
37
+ addCookiesToDocument(document);
38
+
39
+ describe("No existing cookies", () => {
40
+ afterEach(() => {
41
+ document.clearAllCookies();
42
+ });
43
+
44
+ test("Initialisation", async () => {
45
+ expect(document.cookie).toEqual("");
46
+
47
+ const cookies = new Cookies();
48
+ expect(cookies).toHaveProperty("all");
49
+ expect(cookies).toBeInstanceOf(Cookies);
50
+
51
+ expect(document.cookie).not.toEqual("");
52
+ });
53
+
54
+ test("Getting/setting", async () => {
55
+ const cookies = new Cookies();
56
+ expect(cookies).toHaveProperty("get");
57
+ expect(cookies).toHaveProperty("set");
58
+ expect(cookies).toHaveProperty("exists");
59
+ expect(cookies).toHaveProperty("hasValue");
60
+
61
+ expect(Object.keys(cookies.all)).toHaveLength(1);
62
+
63
+ const testKey = "foo";
64
+ const testValue = "bar";
65
+
66
+ expect(cookies.all).not.toHaveProperty(testKey);
67
+ expect(cookies.exists(testKey)).toEqual(false);
68
+
69
+ cookies.set(testKey, testValue);
70
+
71
+ expect(Object.keys(cookies.all)).toHaveLength(2);
72
+
73
+ expect(cookies.all).toHaveProperty(testKey);
74
+ expect(cookies.all[testKey]).toEqual(testValue);
75
+ expect(cookies.exists(testKey)).toEqual(true);
76
+ expect(cookies.get(testKey)).toEqual(testValue);
77
+ expect(cookies.hasValue(testKey, testValue)).toEqual(true);
78
+ expect(cookies.hasValue(testKey, "different")).toEqual(false);
79
+ });
80
+
81
+ test("Deletion", async () => {
82
+ const cookies = new Cookies();
83
+ expect(cookies).toHaveProperty("delete");
84
+
85
+ const testKey = "foo";
86
+ const testValue = "bar";
87
+
88
+ cookies.set(testKey, testValue);
89
+
90
+ expect(cookies.all).toHaveProperty(testKey);
91
+ expect(cookies.all[testKey]).toEqual(testValue);
92
+ expect(cookies.exists(testKey)).toEqual(true);
93
+ expect(cookies.get(testKey)).toEqual(testValue);
94
+
95
+ cookies.delete(testKey);
96
+
97
+ // expect(cookies.all).not.toHaveProperty(testKey);
98
+ // expect(cookies.exists(testKey)).toEqual(false);
99
+ expect(cookies.get(testKey)).toEqual("");
100
+ });
101
+
102
+ test("Deletion of all", async () => {
103
+ const cookies = new Cookies();
104
+
105
+ const testKeys = ["foo", "bar"];
106
+ const testValue = "testValue";
107
+
108
+ testKeys.forEach((testKey) => cookies.set(testKey, testValue));
109
+
110
+ testKeys.forEach((testKey) => {
111
+ expect(cookies.get(testKey)).toEqual(testValue);
112
+ });
113
+
114
+ cookies.deleteAll();
115
+
116
+ testKeys.forEach((testKey) => {
117
+ expect(cookies.get(testKey)).toEqual("");
118
+ });
119
+ });
120
+
121
+ test("Initial policies", async () => {
122
+ const cookies = new Cookies();
123
+ expect(cookies).toHaveProperty("policies");
124
+
125
+ expect(cookies.policies).toHaveProperty("essential");
126
+ expect(cookies.policies.essential).toEqual(true);
127
+ expect(JSON.parse(cookies.get("cookies_policy"))).toHaveProperty(
128
+ "essential",
129
+ );
130
+ expect(cookies.policies).toHaveProperty("settings");
131
+ expect(cookies.policies.settings).toEqual(false);
132
+ expect(JSON.parse(cookies.get("cookies_policy"))).toHaveProperty(
133
+ "settings",
134
+ );
135
+ expect(cookies.policies).toHaveProperty("usage");
136
+ expect(cookies.policies.usage).toEqual(false);
137
+ expect(JSON.parse(cookies.get("cookies_policy"))).toHaveProperty("usage");
138
+ });
139
+
140
+ test("Accept policy", async () => {
141
+ const cookies = new Cookies();
142
+ expect(cookies).toHaveProperty("isPolicyAccepted");
143
+
144
+ expect(cookies.policies).toHaveProperty("essential");
145
+ expect(cookies.policies.essential).toEqual(true);
146
+ expect(cookies.isPolicyAccepted("essential")).toEqual(true);
147
+ expect(cookies.policies).toHaveProperty("settings");
148
+ expect(cookies.policies.settings).toEqual(false);
149
+ expect(cookies.isPolicyAccepted("settings")).toEqual(false);
150
+ expect(cookies.policies).toHaveProperty("usage");
151
+ expect(cookies.policies.usage).toEqual(false);
152
+ expect(cookies.isPolicyAccepted("usage")).toEqual(false);
153
+
154
+ cookies.acceptPolicy("settings");
155
+ expect(cookies.policies.essential).toEqual(true);
156
+ expect(cookies.isPolicyAccepted("essential")).toEqual(true);
157
+ expect(cookies.policies.settings).toEqual(true);
158
+ expect(cookies.isPolicyAccepted("settings")).toEqual(true);
159
+ expect(cookies.policies.usage).toEqual(false);
160
+ expect(cookies.isPolicyAccepted("usage")).toEqual(false);
161
+
162
+ cookies.acceptPolicy("usage");
163
+ expect(cookies.policies.essential).toEqual(true);
164
+ expect(cookies.isPolicyAccepted("essential")).toEqual(true);
165
+ expect(cookies.policies.settings).toEqual(true);
166
+ expect(cookies.isPolicyAccepted("settings")).toEqual(true);
167
+ expect(cookies.policies.usage).toEqual(true);
168
+ expect(cookies.isPolicyAccepted("usage")).toEqual(true);
169
+ });
170
+
171
+ test("Accept all policies", async () => {
172
+ const cookies = new Cookies();
173
+ expect(cookies).toHaveProperty("acceptAllPolicies");
174
+
175
+ expect(cookies.policies).toHaveProperty("essential");
176
+ expect(cookies.policies.essential).toEqual(true);
177
+ expect(cookies.isPolicyAccepted("essential")).toEqual(true);
178
+ expect(cookies.policies).toHaveProperty("settings");
179
+ expect(cookies.policies.settings).toEqual(false);
180
+ expect(cookies.isPolicyAccepted("settings")).toEqual(false);
181
+ expect(cookies.policies).toHaveProperty("usage");
182
+ expect(cookies.policies.usage).toEqual(false);
183
+ expect(cookies.isPolicyAccepted("usage")).toEqual(false);
184
+
185
+ cookies.acceptAllPolicies();
186
+ expect(cookies.policies.essential).toEqual(true);
187
+ expect(cookies.isPolicyAccepted("essential")).toEqual(true);
188
+ expect(cookies.policies.settings).toEqual(true);
189
+ expect(cookies.isPolicyAccepted("settings")).toEqual(true);
190
+ expect(cookies.policies.usage).toEqual(true);
191
+ expect(cookies.isPolicyAccepted("usage")).toEqual(true);
192
+ });
193
+
194
+ test("Reject policy", async () => {
195
+ const cookies = new Cookies();
196
+
197
+ cookies.acceptPolicy("settings");
198
+ cookies.acceptPolicy("usage");
199
+ expect(cookies.policies.essential).toEqual(true);
200
+ expect(cookies.isPolicyAccepted("essential")).toEqual(true);
201
+ expect(cookies.policies.settings).toEqual(true);
202
+ expect(cookies.isPolicyAccepted("settings")).toEqual(true);
203
+ expect(cookies.policies.usage).toEqual(true);
204
+ expect(cookies.isPolicyAccepted("usage")).toEqual(true);
205
+
206
+ cookies.rejectPolicy("settings");
207
+ expect(cookies.policies.essential).toEqual(true);
208
+ expect(cookies.isPolicyAccepted("essential")).toEqual(true);
209
+ expect(cookies.policies.settings).toEqual(false);
210
+ expect(cookies.isPolicyAccepted("settings")).toEqual(false);
211
+ expect(cookies.policies.usage).toEqual(true);
212
+ expect(cookies.isPolicyAccepted("usage")).toEqual(true);
213
+
214
+ cookies.rejectPolicy("usage");
215
+ expect(cookies.policies.essential).toEqual(true);
216
+ expect(cookies.isPolicyAccepted("essential")).toEqual(true);
217
+ expect(cookies.policies.settings).toEqual(false);
218
+ expect(cookies.isPolicyAccepted("settings")).toEqual(false);
219
+ expect(cookies.policies.usage).toEqual(false);
220
+ expect(cookies.isPolicyAccepted("usage")).toEqual(false);
221
+ });
222
+
223
+ test("Reject all policies", async () => {
224
+ const cookies = new Cookies();
225
+ expect(cookies).toHaveProperty("rejectAllPolicies");
226
+
227
+ cookies.acceptAllPolicies();
228
+ expect(cookies.policies.essential).toEqual(true);
229
+ expect(cookies.isPolicyAccepted("essential")).toEqual(true);
230
+ expect(cookies.policies.settings).toEqual(true);
231
+ expect(cookies.isPolicyAccepted("settings")).toEqual(true);
232
+ expect(cookies.policies.usage).toEqual(true);
233
+ expect(cookies.isPolicyAccepted("usage")).toEqual(true);
234
+
235
+ cookies.rejectAllPolicies();
236
+ expect(cookies.policies.essential).toEqual(true);
237
+ expect(cookies.isPolicyAccepted("essential")).toEqual(true);
238
+ expect(cookies.policies.settings).toEqual(false);
239
+ expect(cookies.isPolicyAccepted("settings")).toEqual(false);
240
+ expect(cookies.policies.usage).toEqual(false);
241
+ expect(cookies.isPolicyAccepted("usage")).toEqual(false);
242
+ });
243
+
244
+ test("Protected essential policy", async () => {
245
+ const cookies = new Cookies();
246
+
247
+ expect(cookies.policies).toHaveProperty("essential");
248
+ expect(cookies.isPolicyAccepted("essential")).toEqual(true);
249
+
250
+ cookies.acceptPolicy("essential");
251
+ expect(cookies.isPolicyAccepted("essential")).toEqual(true);
252
+
253
+ cookies.rejectPolicy("essential");
254
+ expect(cookies.isPolicyAccepted("essential")).toEqual(true);
255
+
256
+ cookies.rejectAllPolicies();
257
+ expect(cookies.isPolicyAccepted("essential")).toEqual(true);
258
+ });
259
+
260
+ test("Basic events", async () => {
261
+ const cookies = new Cookies();
262
+ expect(cookies).toHaveProperty("on");
263
+
264
+ const mockCallback = jest.fn();
265
+ cookies.on("setCookie", mockCallback);
266
+ const testKey = "foo";
267
+ const testValue = "bar";
268
+
269
+ cookies.set(testKey, testValue);
270
+
271
+ expect(mockCallback.mock.calls).toHaveLength(1);
272
+ expect(mockCallback.mock.calls[0][0]).toStrictEqual({
273
+ key: testKey,
274
+ value: testValue,
275
+ domain: "",
276
+ path: "/",
277
+ sameSite: "Lax",
278
+ secure: true,
279
+ maxAge: 31536000,
280
+ cookie: `${testKey}=${testValue}; samesite=Lax; path=/; max-age=31536000; secure`,
281
+ });
282
+
283
+ cookies.set(testKey, testValue);
284
+
285
+ expect(mockCallback.mock.calls).toHaveLength(2);
286
+ expect(mockCallback.mock.calls[1][0]).toStrictEqual({
287
+ key: testKey,
288
+ value: testValue,
289
+ domain: "",
290
+ path: "/",
291
+ sameSite: "Lax",
292
+ secure: true,
293
+ maxAge: 31536000,
294
+ cookie: `${testKey}=${testValue}; samesite=Lax; path=/; max-age=31536000; secure`,
295
+ });
296
+ });
297
+
298
+ test("All events", async () => {
299
+ const cookies = new Cookies();
300
+
301
+ const mockSetCookieCallback = jest.fn();
302
+ cookies.on("setCookie", mockSetCookieCallback);
303
+ const mockDeleteCookieCallback = jest.fn();
304
+ cookies.on("deleteCookie", mockDeleteCookieCallback);
305
+ const mockDeleteAllCookiesCallback = jest.fn();
306
+ cookies.on("deleteAllCookies", mockDeleteAllCookiesCallback);
307
+ const mockAcceptPolicyCallback = jest.fn();
308
+ cookies.on("acceptPolicy", mockAcceptPolicyCallback);
309
+ const mockRejectPolicyCallback = jest.fn();
310
+ cookies.on("rejectPolicy", mockRejectPolicyCallback);
311
+ const mockAcceptAllPoliciesCallback = jest.fn();
312
+ cookies.on("acceptAllPolicies", mockAcceptAllPoliciesCallback);
313
+ const mockRejectAllPoliciesCallback = jest.fn();
314
+ cookies.on("rejectAllPolicies", mockRejectAllPoliciesCallback);
315
+ const mockChangePolicyCallback = jest.fn();
316
+ cookies.on("changePolicy", mockChangePolicyCallback);
317
+
318
+ const testKey = "foo";
319
+ const testValue = "bar";
320
+ cookies.set(testKey, testValue);
321
+ cookies.delete(testKey);
322
+ cookies.acceptPolicy("settings");
323
+ cookies.rejectPolicy("settings");
324
+ cookies.setPolicy("settings", true);
325
+ cookies.acceptAllPolicies();
326
+ cookies.rejectAllPolicies();
327
+ cookies.deleteAll();
328
+
329
+ expect(mockSetCookieCallback.mock.calls).toHaveLength(9);
330
+ expect(mockDeleteCookieCallback.mock.calls).toHaveLength(3);
331
+ expect(mockDeleteAllCookiesCallback.mock.calls).toHaveLength(1);
332
+ expect(mockAcceptPolicyCallback.mock.calls).toHaveLength(1);
333
+ expect(mockRejectPolicyCallback.mock.calls).toHaveLength(1);
334
+ expect(mockAcceptAllPoliciesCallback.mock.calls).toHaveLength(1);
335
+ expect(mockRejectAllPoliciesCallback.mock.calls).toHaveLength(1);
336
+ expect(mockChangePolicyCallback.mock.calls).toHaveLength(7);
337
+ });
338
+
339
+ test("Shared events", async () => {
340
+ const mockCallback = jest.fn();
341
+
342
+ const cookies1 = new Cookies();
343
+
344
+ const cookies2 = new Cookies();
345
+ cookies2.on("setCookie", mockCallback);
346
+
347
+ const testKey = "foo";
348
+ const testValue = "bar";
349
+
350
+ cookies1.set(testKey, testValue);
351
+ expect(mockCallback.mock.calls).toHaveLength(1);
352
+
353
+ cookies1.set(testKey, testValue);
354
+ expect(mockCallback.mock.calls).toHaveLength(2);
355
+
356
+ cookies2.set(testKey, testValue);
357
+ expect(mockCallback.mock.calls).toHaveLength(3);
358
+ });
359
+ });
360
+
361
+ describe("Existing cookies", () => {
362
+ beforeEach(() => {
363
+ document.clearAllCookies();
364
+ document.cookie =
365
+ "cookies_policy=%7B%22usage%22%3Afalse%2C%22settings%22%3Atrue%2C%22essential%22%3Atrue%7D";
366
+ });
367
+
368
+ test("Initialisation", async () => {
369
+ const cookies = new Cookies();
370
+
371
+ expect(cookies.all).toHaveProperty("cookies_policy");
372
+ expect(cookies.policies).toHaveProperty("essential");
373
+ expect(cookies.isPolicyAccepted("essential")).toEqual(true);
374
+ expect(cookies.policies).toHaveProperty("settings");
375
+ expect(cookies.isPolicyAccepted("settings")).toEqual(true);
376
+ expect(cookies.policies).toHaveProperty("usage");
377
+ expect(cookies.isPolicyAccepted("usage")).toEqual(false);
378
+ });
379
+
380
+ test("Update policies", async () => {
381
+ const cookies = new Cookies();
382
+ cookies.acceptPolicy("usage");
383
+ cookies.rejectPolicy("settings");
384
+
385
+ expect(cookies.isPolicyAccepted("essential")).toEqual(true);
386
+ expect(cookies.isPolicyAccepted("settings")).toEqual(false);
387
+ expect(cookies.isPolicyAccepted("usage")).toEqual(true);
388
+ });
389
+ });
390
+
391
+ describe("Existing empty cookie policies", () => {
392
+ beforeEach(() => {
393
+ document.clearAllCookies();
394
+ document.cookie = "cookies_policy=%7B%7D";
395
+ });
396
+
397
+ test("Initialisation", async () => {
398
+ const cookies = new Cookies();
399
+
400
+ expect(cookies.all).toHaveProperty("cookies_policy");
401
+ expect(cookies.policies).toHaveProperty("essential");
402
+ expect(cookies.isPolicyAccepted("essential")).toEqual(true);
403
+ expect(cookies.policies).toHaveProperty("settings");
404
+ expect(cookies.isPolicyAccepted("settings")).toEqual(false);
405
+ expect(cookies.policies).toHaveProperty("usage");
406
+ expect(cookies.isPolicyAccepted("usage")).toEqual(false);
407
+ });
408
+ });
409
+
410
+ describe("Existing malformed cookie policies", () => {
411
+ beforeEach(() => {
412
+ document.clearAllCookies();
413
+ document.cookie = "cookies_policy=foobar";
414
+ });
415
+
416
+ test("Initialisation", async () => {
417
+ const cookies = new Cookies();
418
+
419
+ expect(cookies.all).toHaveProperty("cookies_policy");
420
+ expect(cookies.policies).toHaveProperty("essential");
421
+ expect(cookies.isPolicyAccepted("essential")).toEqual(true);
422
+ expect(cookies.policies).toHaveProperty("settings");
423
+ expect(cookies.isPolicyAccepted("settings")).toEqual(false);
424
+ expect(cookies.policies).toHaveProperty("usage");
425
+ expect(cookies.isPolicyAccepted("usage")).toEqual(false);
426
+ });
427
+ });
@@ -0,0 +1,17 @@
1
+ import { describe, expect, test } from "@jest/globals";
2
+ import { TextEncoder, TextDecoder, store, options } from "util";
3
+ import uuidv4 from "../lib/uuid.mjs";
4
+
5
+ global.TextEncoder = TextEncoder;
6
+ global.TextDecoder = TextDecoder;
7
+ global.store = store;
8
+ global.options = options;
9
+
10
+ describe("UUID", () => {
11
+ test("Initialisation", async () => {
12
+ const uuid1 = uuidv4();
13
+ const uuid2 = uuidv4();
14
+
15
+ expect(uuid1).not.toEqual(uuid2);
16
+ });
17
+ });
@@ -32,7 +32,6 @@
32
32
 
33
33
  @mixin accent-css-vars($colour) {
34
34
  @if $colour == "yellow" {
35
- --accent: #{brand-colour("yellow")} !important;
36
35
  --accent-background: #{brand-colour("yellow")} !important;
37
36
  --accent-background-light: #{brand-colour("cream")} !important;
38
37
  --accent-font-base: #{brand-colour("black")} !important;
@@ -53,29 +52,23 @@
53
52
  --accent-link-visited: #{brand-colour("white")} !important;
54
53
  --accent-keyline: #{brand-colour("white", 0.5)} !important;
55
54
  --accent-keyline-dark: #{brand-colour("white", 0.8)} !important;
56
- @if $colour != "black" {
57
- --button-accent-text: #{brand-colour("white")} !important;
58
- @if $colour == "pink" {
59
- --accent: #{brand-colour("pink")} !important;
60
- --accent-background: #{brand-colour("maroon")} !important;
61
- --accent-background-light: #{brand-colour("pastel-pink")} !important;
62
- --button-accent-background: #{brand-colour("maroon")} !important;
63
- } @else if $colour == "orange" {
64
- --accent: #{brand-colour("orange")} !important;
65
- --accent-background: #{brand-colour("chestnut")} !important;
66
- --accent-background-light: #{brand-colour("pastel-orange")} !important;
67
- --button-accent-background: #{brand-colour("chestnut")} !important;
68
- } @else if $colour == "green" {
69
- --accent: #{brand-colour("green")} !important;
70
- --accent-background: #{brand-colour("forest")} !important;
71
- --accent-background-light: #{brand-colour("pastel-green")} !important;
72
- --button-accent-background: #{brand-colour("forest")} !important;
73
- } @else if $colour == "blue" {
74
- --accent: #{brand-colour("blue")} !important;
75
- --accent-background: #{brand-colour("navy")} !important;
76
- --accent-background-light: #{brand-colour("pastel-blue")} !important;
77
- --button-accent-background: #{brand-colour("navy")} !important;
78
- }
55
+ --button-accent-text: #{brand-colour("white")} !important;
56
+ @if $colour == "pink" {
57
+ --accent-background: #{brand-colour("maroon")} !important;
58
+ --accent-background-light: #{brand-colour("pastel-pink")} !important;
59
+ --button-accent-background: #{brand-colour("maroon")} !important;
60
+ } @else if $colour == "orange" {
61
+ --accent-background: #{brand-colour("chestnut")} !important;
62
+ --accent-background-light: #{brand-colour("pastel-orange")} !important;
63
+ --button-accent-background: #{brand-colour("chestnut")} !important;
64
+ } @else if $colour == "green" {
65
+ --accent-background: #{brand-colour("forest")} !important;
66
+ --accent-background-light: #{brand-colour("pastel-green")} !important;
67
+ --button-accent-background: #{brand-colour("forest")} !important;
68
+ } @else if $colour == "blue" {
69
+ --accent-background: #{brand-colour("navy")} !important;
70
+ --accent-background-light: #{brand-colour("pastel-blue")} !important;
71
+ --button-accent-background: #{brand-colour("navy")} !important;
79
72
  }
80
73
  }
81
74
  }
@@ -254,7 +247,7 @@
254
247
  --font-light: var(--accent-font-light);
255
248
  --icon-light: var(--accent-icon-light);
256
249
  --link: var(--accent-link);
257
- --link-visited: var(--accent-link-visited);
250
+ --link-visited: var(--accent-link);
258
251
  --keyline: var(--accent-keyline);
259
252
  --keyline-dark: var(--accent-keyline-dark);
260
253
 
@@ -269,6 +262,7 @@
269
262
 
270
263
  %tint {
271
264
  @include colour-background("background-tint");
265
+ @include colour-font("font-base");
272
266
  }
273
267
 
274
268
  @mixin tint {
@@ -288,8 +282,8 @@
288
282
  --font-base: #{map.get(colour.$colour-palette-default, "font-base")};
289
283
  --font-dark: #{map.get(colour.$colour-palette-default, "font-dark")};
290
284
  --font-light: #{map.get(colour.$colour-palette-default, "font-light")};
291
- --link: #{map.get(colour.$colour-palette-default, "font-dark")};
292
- --link-visited: #{map.get(colour.$colour-palette-default, "link-visited")};
285
+ // --link: #{map.get(colour.$colour-palette-default, "link")};
286
+ // --link-visited: #{map.get(colour.$colour-palette-default, "link-visited")};
293
287
  --keyline: #{map.get(colour.$colour-palette-default, "keyline")};
294
288
  --keyline-dark: #{map.get(colour.$colour-palette-default, "keyline-dark")};
295
289
  --button-text: #{map.get(colour.$colour-palette-default, "button-text")};
@@ -307,6 +301,19 @@
307
301
  )};
308
302
 
309
303
  @include colour-background("background");
304
+ @include colour-font("font-base");
305
+
306
+ .tna-template--system-theme & {
307
+ @media (prefers-color-scheme: dark) {
308
+ --link: #{map.get(colour.$colour-palette-default, "link")};
309
+ --link-visited: #{map.get(colour.$colour-palette-default, "link-visited")};
310
+ }
311
+ }
312
+
313
+ .tna-template--dark-theme & {
314
+ --link: #{map.get(colour.$colour-palette-default, "link")};
315
+ --link-visited: #{map.get(colour.$colour-palette-default, "link-visited")};
316
+ }
310
317
  }
311
318
 
312
319
  @mixin accent-light {
@@ -324,3 +331,19 @@
324
331
  }
325
332
  }
326
333
  }
334
+
335
+ @mixin on-forced-colours {
336
+ @media (forced-colors: active) {
337
+ @content;
338
+ }
339
+ }
340
+
341
+ @mixin on-high-contrast-and-forced-colours {
342
+ @include on-forced-colours {
343
+ @content;
344
+ }
345
+
346
+ @include on-high-contrast {
347
+ @content;
348
+ }
349
+ }
@@ -47,5 +47,4 @@
47
47
  @include relative-font-size(14);
48
48
  text-transform: uppercase;
49
49
  line-height: #{math.div(typography.$relative-1rem-px, 14)};
50
- // line-height: 1;
51
50
  }
@@ -26,11 +26,15 @@
26
26
  }
27
27
  }
28
28
 
29
+ @mixin focus-outline {
30
+ @include colour.colour-outline("focus-outline", 0.3125rem, solid);
31
+ outline-offset: 0.125rem;
32
+ }
33
+
29
34
  *:focus {
30
35
  z-index: 9;
31
36
 
32
- @include colour.colour-outline("focus-outline", 0.3125rem, solid);
33
- outline-offset: 0.125rem;
37
+ @include focus-outline;
34
38
  }
35
39
 
36
40
  .tna-\!--no-focus-style {
@@ -7,8 +7,6 @@
7
7
  .tna-template {
8
8
  @include colour.colour-background("page-background");
9
9
 
10
- accent-color: var(--accent);
11
-
12
10
  &--system-theme {
13
11
  @include colour.colour-css-vars;
14
12
 
@@ -49,10 +47,6 @@
49
47
  }
50
48
  }
51
49
 
52
- &--black-accent {
53
- @include colour.accent-css-vars("black");
54
- }
55
-
56
50
  &--yellow-accent {
57
51
  @include colour.accent-css-vars("yellow");
58
52
  }
@@ -98,3 +92,13 @@
98
92
  @include colour.accent-light;
99
93
  }
100
94
  }
95
+
96
+ .tna-border {
97
+ &-keyline {
98
+ @include colour.colour-border("keyline", 1px);
99
+ }
100
+
101
+ &-keyline-dark {
102
+ @include colour.colour-border("keyline-dark", 1px);
103
+ }
104
+ }
@@ -18,9 +18,7 @@
18
18
  0 0 0 2px #f0a,
19
19
  0 0 0.5rem #f0a !important;
20
20
 
21
- position: relative;
22
-
23
- &::before {
21
+ &::after {
24
22
  width: 20px;
25
23
  height: 20px;
26
24
 
@@ -45,7 +43,8 @@
45
43
  content: "";
46
44
  }
47
45
 
48
- .tna-template--dark-theme & {
46
+ &:not(.tna-checkboxes__item-label, .tna-radios__item-label) {
47
+ position: relative;
49
48
  }
50
49
  }
51
50
  }