@ons/design-system 70.0.6 → 70.0.8

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 (308) hide show
  1. package/README.md +11 -17
  2. package/components/access-code/_macro.spec.js +145 -145
  3. package/components/access-code/access-code.dom.js +5 -5
  4. package/components/access-code/access-code.js +16 -16
  5. package/components/access-code/access-code.scss +22 -22
  6. package/components/access-code/access-code.spec.js +17 -17
  7. package/components/accordion/_macro.spec.js +154 -154
  8. package/components/accordion/accordion.dom.js +10 -10
  9. package/components/accordion/accordion.js +50 -50
  10. package/components/accordion/accordion.spec.js +104 -104
  11. package/components/address-input/_macro.spec.js +420 -420
  12. package/components/address-input/autosuggest.address.dom.js +5 -5
  13. package/components/address-input/autosuggest.address.error.js +77 -77
  14. package/components/address-input/autosuggest.address.js +357 -357
  15. package/components/address-input/autosuggest.address.setter.js +95 -95
  16. package/components/address-input/autosuggest.address.spec.js +668 -651
  17. package/components/address-input/example-address-input-editable.njk +1 -1
  18. package/components/address-input/example-address-input.njk +1 -1
  19. package/components/address-output/_address-output.scss +3 -3
  20. package/components/address-output/_macro.spec.js +84 -84
  21. package/components/autosuggest/_autosuggest.scss +114 -114
  22. package/components/autosuggest/_macro.spec.js +255 -255
  23. package/components/autosuggest/autosuggest.dom.js +5 -5
  24. package/components/autosuggest/autosuggest.helpers.js +11 -11
  25. package/components/autosuggest/autosuggest.helpers.spec.js +73 -73
  26. package/components/autosuggest/autosuggest.js +20 -20
  27. package/components/autosuggest/autosuggest.spec.js +542 -536
  28. package/components/autosuggest/autosuggest.ui.js +478 -475
  29. package/components/autosuggest/fuse-config.js +17 -17
  30. package/components/back-to-top/_back-to-top.scss +27 -27
  31. package/components/back-to-top/_macro.spec.js +49 -49
  32. package/components/back-to-top/back-to-top.dom.js +5 -5
  33. package/components/back-to-top/back-to-top.js +52 -52
  34. package/components/back-to-top/back-to-top.spec.js +106 -106
  35. package/components/back-to-top/example-back-to-top.njk +6 -6
  36. package/components/breadcrumbs/_breadcrumbs.scss +63 -65
  37. package/components/breadcrumbs/_macro.spec.js +91 -91
  38. package/components/browser-banner/_browser-banner.scss +23 -23
  39. package/components/browser-banner/_macro.spec.js +92 -92
  40. package/components/button/_button.scss +482 -483
  41. package/components/button/_macro.spec.js +363 -363
  42. package/components/button/button.dom.js +15 -15
  43. package/components/button/button.js +53 -53
  44. package/components/button/button.spec.js +248 -240
  45. package/components/call-to-action/_call-to-action.scss +5 -5
  46. package/components/call-to-action/_macro.spec.js +28 -28
  47. package/components/card/_card.scss +23 -23
  48. package/components/card/_macro.spec.js +180 -180
  49. package/components/char-check-limit/_macro.spec.js +48 -48
  50. package/components/char-check-limit/character-check.js +58 -58
  51. package/components/char-check-limit/character-check.spec.js +173 -173
  52. package/components/char-check-limit/character-limit.js +40 -40
  53. package/components/checkboxes/_checkbox-macro.spec.js +355 -355
  54. package/components/checkboxes/_checkbox.scss +180 -180
  55. package/components/checkboxes/_checkboxes.scss +37 -27
  56. package/components/checkboxes/_macro.spec.js +261 -261
  57. package/components/checkboxes/checkbox-with-autoselect.js +32 -32
  58. package/components/checkboxes/checkbox-with-fieldset.js +21 -21
  59. package/components/checkboxes/checkboxes-with-reveal.js +10 -10
  60. package/components/checkboxes/checkboxes.dom.js +27 -27
  61. package/components/checkboxes/checkboxes.spec.js +183 -183
  62. package/components/content-pagination/_content-pagination.scss +41 -41
  63. package/components/content-pagination/_macro.spec.js +159 -159
  64. package/components/cookies-banner/_cookies-banner.scss +22 -22
  65. package/components/cookies-banner/_macro.spec.js +177 -177
  66. package/components/cookies-banner/cookies-banner.dom.js +7 -7
  67. package/components/cookies-banner/cookies-banner.js +76 -76
  68. package/components/cookies-banner/cookies-banner.spec.js +72 -68
  69. package/components/date-input/_macro.spec.js +338 -338
  70. package/components/description-list/_description-list.scss +23 -23
  71. package/components/description-list/_macro.spec.js +144 -144
  72. package/components/details/_details.scss +109 -109
  73. package/components/details/_macro.spec.js +132 -132
  74. package/components/details/details.dom.js +6 -6
  75. package/components/details/details.js +60 -60
  76. package/components/details/details.spec.js +106 -106
  77. package/components/document-list/_macro.spec.js +444 -444
  78. package/components/document-list/document-list.scss +145 -149
  79. package/components/download-resources/_download-resources.scss +109 -108
  80. package/components/download-resources/download-resources.js +907 -900
  81. package/components/download-resources/download-resources.spec.js +461 -461
  82. package/components/duration/_macro.spec.js +291 -291
  83. package/components/error/_macro.spec.js +72 -72
  84. package/components/external-link/_external-link.scss +19 -19
  85. package/components/external-link/_macro.spec.js +68 -68
  86. package/components/feedback/_feedback.scss +31 -31
  87. package/components/feedback/_macro.spec.js +72 -72
  88. package/components/field/_field-group.scss +10 -10
  89. package/components/field/_field.scss +16 -16
  90. package/components/field/_macro.spec.js +80 -80
  91. package/components/fieldset/_fieldset.scss +27 -27
  92. package/components/fieldset/_macro.spec.js +161 -161
  93. package/components/footer/_footer.scss +45 -45
  94. package/components/footer/_macro.spec.js +452 -452
  95. package/components/header/_header.scss +202 -202
  96. package/components/header/_macro.spec.js +833 -829
  97. package/components/helpers/_grid.scss +4 -4
  98. package/components/hero/_hero.scss +48 -48
  99. package/components/hero/_macro.spec.js +59 -59
  100. package/components/icon/_icon.scss +44 -44
  101. package/components/icon/_macro.spec.js +110 -110
  102. package/components/image/_image.scss +11 -11
  103. package/components/image/_macro.spec.js +81 -81
  104. package/components/input/_input-type.scss +86 -89
  105. package/components/input/_input.scss +123 -124
  106. package/components/input/_macro.spec.js +604 -604
  107. package/components/input/character-check.dom.js +5 -5
  108. package/components/input/input.dom.js +5 -5
  109. package/components/input/input.js +10 -10
  110. package/components/input/input.spec.js +18 -18
  111. package/components/label/_label.scss +24 -24
  112. package/components/label/_macro.spec.js +173 -170
  113. package/components/language-selector/_macro.spec.js +97 -97
  114. package/components/language-selector/language.scss +7 -7
  115. package/components/list/_list.scss +84 -84
  116. package/components/list/_macro.njk +2 -2
  117. package/components/list/_macro.spec.js +583 -583
  118. package/components/message/_macro.njk +5 -5
  119. package/components/message/_macro.spec.js +74 -74
  120. package/components/message/_message.scss +39 -39
  121. package/components/message-list/_macro.spec.js +86 -86
  122. package/components/message-list/_message-list.scss +16 -16
  123. package/components/modal/_macro.spec.js +69 -69
  124. package/components/modal/_modal.scss +36 -36
  125. package/components/modal/modal.dom.js +6 -6
  126. package/components/modal/modal.js +89 -89
  127. package/components/modal/modal.spec.js +50 -50
  128. package/components/mutually-exclusive/_macro.spec.js +140 -140
  129. package/components/mutually-exclusive/mutually-exclusive.checkboxes.spec.js +188 -188
  130. package/components/mutually-exclusive/mutually-exclusive.date.spec.js +211 -211
  131. package/components/mutually-exclusive/mutually-exclusive.dom.js +5 -5
  132. package/components/mutually-exclusive/mutually-exclusive.duration.spec.js +210 -210
  133. package/components/mutually-exclusive/mutually-exclusive.email.spec.js +90 -90
  134. package/components/mutually-exclusive/mutually-exclusive.js +137 -137
  135. package/components/mutually-exclusive/mutually-exclusive.multiple-options.checkboxes.spec.js +197 -197
  136. package/components/mutually-exclusive/mutually-exclusive.number.spec.js +96 -96
  137. package/components/mutually-exclusive/mutually-exclusive.textarea.spec.js +102 -102
  138. package/components/navigation/_macro.spec.js +360 -354
  139. package/components/navigation/_navigation.scss +122 -123
  140. package/components/navigation/navigation.dom.js +35 -35
  141. package/components/navigation/navigation.js +49 -49
  142. package/components/navigation/navigation.spec.js +249 -249
  143. package/components/pagination/_macro.spec.js +342 -335
  144. package/components/pagination/_pagination.scss +58 -58
  145. package/components/panel/_macro.spec.js +372 -372
  146. package/components/panel/_panel.scss +200 -199
  147. package/components/password/_macro.spec.js +95 -95
  148. package/components/password/password.dom.js +5 -5
  149. package/components/password/password.js +10 -10
  150. package/components/password/password.spec.js +26 -26
  151. package/components/phase-banner/_macro.spec.js +86 -86
  152. package/components/phase-banner/_phase-banner.scss +16 -16
  153. package/components/question/_macro.spec.js +235 -235
  154. package/components/question/_question.scss +24 -24
  155. package/components/quote/_macro.spec.js +52 -52
  156. package/components/quote/_quote.scss +24 -24
  157. package/components/radios/_macro.spec.js +524 -524
  158. package/components/radios/_radio.scss +49 -48
  159. package/components/radios/_radios.scss +14 -20
  160. package/components/radios/check-radios.js +21 -21
  161. package/components/radios/clear-radios.js +45 -45
  162. package/components/radios/radio-with-fieldset.js +22 -22
  163. package/components/radios/radios.dom.js +32 -32
  164. package/components/radios/radios.spec.js +251 -251
  165. package/components/related-content/_macro.spec.js +109 -109
  166. package/components/related-content/_related-content.scss +12 -12
  167. package/components/related-content/_section-macro.spec.js +20 -20
  168. package/components/relationships/_macro.spec.js +94 -94
  169. package/components/relationships/_relationships.scss +9 -9
  170. package/components/relationships/relationships.dom.js +5 -5
  171. package/components/relationships/relationships.js +18 -18
  172. package/components/relationships/relationships.spec.js +71 -71
  173. package/components/reply/_macro.spec.js +47 -47
  174. package/components/reply/reply-input.js +15 -15
  175. package/components/reply/reply.dom.js +5 -5
  176. package/components/reply/reply.spec.js +57 -57
  177. package/components/section-navigation/_macro.spec.js +210 -210
  178. package/components/section-navigation/_section-navigation.scss +76 -76
  179. package/components/select/_macro.spec.js +166 -166
  180. package/components/share-page/_macro.spec.js +68 -68
  181. package/components/skip-to-content/_macro.spec.js +54 -54
  182. package/components/skip-to-content/_skip.scss +30 -30
  183. package/components/skip-to-content/skip-to-content.dom.js +6 -6
  184. package/components/skip-to-content/skip-to-content.js +7 -7
  185. package/components/skip-to-content/skip-to-content.spec.js +21 -21
  186. package/components/status/_macro.spec.js +53 -53
  187. package/components/status/_status.scss +32 -32
  188. package/components/summary/_macro.spec.js +551 -535
  189. package/components/summary/_summary.scss +191 -195
  190. package/components/table/_macro.spec.js +499 -499
  191. package/components/table/_table.scss +204 -201
  192. package/components/table/scrollable-table.dom.js +5 -5
  193. package/components/table/scrollable-table.js +60 -60
  194. package/components/table/sortable-table.dom.js +5 -5
  195. package/components/table/sortable-table.js +135 -135
  196. package/components/table/table.spec.js +144 -140
  197. package/components/table-of-contents/_macro.spec.js +125 -125
  198. package/components/table-of-contents/_toc.scss +9 -9
  199. package/components/table-of-contents/toc.dom.js +5 -5
  200. package/components/table-of-contents/toc.js +30 -30
  201. package/components/table-of-contents/toc.spec.js +88 -88
  202. package/components/tabs/_macro.spec.js +92 -92
  203. package/components/tabs/_tabs.scss +120 -115
  204. package/components/tabs/tabs.dom.js +5 -5
  205. package/components/tabs/tabs.js +266 -266
  206. package/components/tabs/tabs.spec.js +268 -268
  207. package/components/text-indent/_macro.spec.js +33 -33
  208. package/components/text-indent/_text-indent.scss +3 -3
  209. package/components/textarea/_macro.spec.js +238 -238
  210. package/components/textarea/textarea.dom.js +5 -5
  211. package/components/textarea/textarea.spec.js +78 -74
  212. package/components/timeline/_macro.spec.js +83 -83
  213. package/components/timeline/_timeline.scss +26 -26
  214. package/components/timeout-modal/_macro.spec.js +47 -47
  215. package/components/timeout-modal/timeout-modal.dom.js +9 -9
  216. package/components/timeout-modal/timeout-modal.js +66 -66
  217. package/components/timeout-modal/timeout-modal.spec.js +157 -157
  218. package/components/timeout-panel/_macro.spec.js +41 -41
  219. package/components/timeout-panel/timeout-panel.dom.js +8 -8
  220. package/components/timeout-panel/timeout-panel.spec.js +118 -118
  221. package/components/upload/_macro.spec.js +52 -52
  222. package/components/upload/_upload.scss +28 -28
  223. package/components/video/_macro.spec.js +42 -42
  224. package/components/video/_video.scss +16 -16
  225. package/components/video/video.dom.js +5 -5
  226. package/components/video/video.js +32 -32
  227. package/components/video/video.spec.js +103 -97
  228. package/css/main.css +1 -1
  229. package/favicons/android-chrome-192x192.png +0 -0
  230. package/favicons/android-chrome-512x512.png +0 -0
  231. package/favicons/apple-touch-icon.png +0 -0
  232. package/favicons/favicon-16x16.png +0 -0
  233. package/favicons/favicon-32x32.png +0 -0
  234. package/favicons/favicon.ico +0 -0
  235. package/favicons/manifest.json +25 -25
  236. package/favicons/maskable_icon.png +0 -0
  237. package/favicons/opengraph.png +0 -0
  238. package/favicons/twitter.png +0 -0
  239. package/img/large/alison-pritchard-featured.jpg +0 -0
  240. package/img/large/alison-pritchard.jpg +0 -0
  241. package/img/large/census-monuments-lights-featured.jpg +0 -0
  242. package/img/large/census-monuments-lights.jpg +0 -0
  243. package/img/large/mother-and-daughter-in-ireland.jpg +0 -0
  244. package/img/large/mum-and-child-healthcare-belfast.jpg +0 -0
  245. package/img/large/ons-award-winners.jpg +0 -0
  246. package/img/large/placeholder-card.png +0 -0
  247. package/img/large/placeholder-news-medium.png +0 -0
  248. package/img/large/placeholder-news.png +0 -0
  249. package/img/large/placeholder-portrait.png +0 -0
  250. package/img/large/students.jpg +0 -0
  251. package/img/large/woman-in-purple-dress-shirt.jpg +0 -0
  252. package/img/small/alison-pritchard-featured.jpg +0 -0
  253. package/img/small/alison-pritchard.jpg +0 -0
  254. package/img/small/census-monuments-lights-featured.jpg +0 -0
  255. package/img/small/census-monuments-lights.jpg +0 -0
  256. package/img/small/mother-and-daughter-in-ireland.jpg +0 -0
  257. package/img/small/mum-and-child-healthcare-belfast.jpg +0 -0
  258. package/img/small/ons-award-winners.jpg +0 -0
  259. package/img/small/placeholder-card.png +0 -0
  260. package/img/small/placeholder-news-medium.png +0 -0
  261. package/img/small/placeholder-news.png +0 -0
  262. package/img/small/placeholder-portrait.png +0 -0
  263. package/img/small/students.jpg +0 -0
  264. package/img/small/woman-in-purple-dress-shirt.jpg +0 -0
  265. package/js/abortable-fetch.js +23 -23
  266. package/js/analytics.js +53 -53
  267. package/js/cookies-functions.js +135 -135
  268. package/js/cookies-settings.dom.js +7 -7
  269. package/js/cookies-settings.js +77 -77
  270. package/js/cookies-settings.spec.js +106 -106
  271. package/js/domready.js +8 -8
  272. package/js/fetch.js +14 -14
  273. package/js/inpagelink.dom.js +5 -5
  274. package/js/inpagelink.js +19 -19
  275. package/js/polyfills.js +0 -1
  276. package/js/print-button.js +6 -6
  277. package/js/timeout.js +211 -211
  278. package/layout/_template.njk +5 -7
  279. package/package.json +131 -127
  280. package/scripts/main.es5.js +1 -1
  281. package/scripts/main.js +1 -1
  282. package/scss/base/_forms.scss +10 -10
  283. package/scss/base/_global.scss +45 -44
  284. package/scss/base/_typography.scss +20 -20
  285. package/scss/helpers/_functions.scss +18 -15
  286. package/scss/helpers/_mixins.scss +59 -53
  287. package/scss/helpers/_mq.scss +62 -65
  288. package/scss/objects/_container.scss +20 -20
  289. package/scss/objects/_page.scss +33 -33
  290. package/scss/objects/_spacing.scss +10 -10
  291. package/scss/overrides/hcm.scss +237 -237
  292. package/scss/overrides/rtl.scss +95 -95
  293. package/scss/print.scss +47 -47
  294. package/scss/utilities/_border.scss +7 -7
  295. package/scss/utilities/_colors.scss +6 -6
  296. package/scss/utilities/_display.scss +8 -8
  297. package/scss/utilities/_float.scss +7 -7
  298. package/scss/utilities/_grid.scss +144 -144
  299. package/scss/utilities/_highlight.scss +4 -4
  300. package/scss/utilities/_margin.scss +17 -17
  301. package/scss/utilities/_pad.scss +15 -15
  302. package/scss/utilities/_typography.scss +35 -33
  303. package/scss/utilities/_utilities.scss +8 -8
  304. package/scss/utilities/_visibility.scss +25 -25
  305. package/scss/vars/_colors.scss +116 -116
  306. package/scss/vars/_forms.scss +22 -22
  307. package/scss/vars/_grid.scss +11 -9
  308. package/scss/vars/_typography.scss +54 -54
@@ -1,268 +1,276 @@
1
1
  import { renderComponent, setTestPage } from '../../tests/helpers/rendering';
2
2
 
3
3
  describe('script: button', () => {
4
- describe('mode: link', () => {
5
- it('navigates to url when button is clicked with the spacebar', async () => {
6
- await setTestPage(
7
- '/test',
8
- renderComponent('button', {
9
- id: 'test-button',
10
- url: '/test/path#abc',
11
- }),
12
- );
13
-
14
- await page.focus('#test-button');
15
-
16
- await Promise.all([page.waitForNavigation(), page.keyboard.press('Space')]);
17
-
18
- const url = await page.url();
19
- expect(url).toBe(`http://localhost:${process.env.TEST_PORT}/test/path#abc`);
20
- });
21
- });
22
-
23
- describe('mode: standard', () => {
24
- it('allow rapidly repeated submissions when in a form', async () => {
25
- await setTestPage(
26
- '/test',
27
- `
28
- <form>
29
- ${renderComponent('button', { id: 'test-button' })}
30
- </form>
31
- `,
32
- );
33
-
34
- await page.evaluate(() => {
35
- window.__COUNTER = 0;
36
- document.querySelector('form').addEventListener('submit', (event) => {
37
- window.__COUNTER++;
38
- event.preventDefault();
4
+ describe('mode: link', () => {
5
+ it('navigates to url when button is clicked with the spacebar', async () => {
6
+ await setTestPage(
7
+ '/test',
8
+ renderComponent('button', {
9
+ id: 'test-button',
10
+ url: '/test/path#abc',
11
+ }),
12
+ );
13
+
14
+ await page.focus('#test-button');
15
+
16
+ await Promise.all([page.waitForNavigation(), page.keyboard.press('Space')]);
17
+
18
+ const url = await page.url();
19
+ expect(url).toBe(`http://localhost:${process.env.TEST_PORT}/test/path#abc`);
39
20
  });
40
- });
41
-
42
- await page.click('#test-button');
43
- await page.click('#test-button');
44
-
45
- const counter = await page.evaluate(() => window.__COUNTER);
46
- expect(counter).toBe(2);
47
- });
48
- });
49
-
50
- describe('mode: loader', () => {
51
- it('disables button when clicked', async () => {
52
- await setTestPage(
53
- '/test',
54
- renderComponent('button', {
55
- id: 'test-button',
56
- text: 'Submit',
57
- variants: 'loader',
58
- }),
59
- );
60
-
61
- await page.click('#test-button');
62
-
63
- const isButtonDisabled = await page.evaluate(() => document.querySelector('#test-button').getAttribute('disabled'));
64
- expect(isButtonDisabled).toBe('true');
65
21
  });
66
22
 
67
- it('initialised without loading style applied', async () => {
68
- await setTestPage(
69
- '/test',
70
- renderComponent('button', {
71
- id: 'test-button',
72
- text: 'Submit',
73
- variants: 'loader',
74
- }),
75
- );
76
-
77
- const hasIsLoadingClass = await page.evaluate(() => document.querySelector('#test-button').classList.contains('ons-is-loading'));
78
- expect(hasIsLoadingClass).toBe(false);
79
- });
80
-
81
- it('applies loading style when clicked', async () => {
82
- await setTestPage(
83
- '/test',
84
- renderComponent('button', {
85
- id: 'test-button',
86
- text: 'Submit',
87
- variants: 'loader',
88
- }),
89
- );
90
-
91
- await page.click('#test-button');
92
-
93
- const hasIsLoadingClass = await page.evaluate(() => document.querySelector('#test-button').classList.contains('ons-is-loading'));
94
- expect(hasIsLoadingClass).toBe(true);
23
+ describe('mode: standard', () => {
24
+ it('allow rapidly repeated submissions when in a form', async () => {
25
+ await setTestPage(
26
+ '/test',
27
+ `
28
+ <form>
29
+ ${renderComponent('button', { id: 'test-button' })}
30
+ </form>
31
+ `,
32
+ );
33
+
34
+ await page.evaluate(() => {
35
+ window.__COUNTER = 0;
36
+ document.querySelector('form').addEventListener('submit', (event) => {
37
+ window.__COUNTER++;
38
+ event.preventDefault();
39
+ });
40
+ });
41
+
42
+ await page.click('#test-button');
43
+ await page.click('#test-button');
44
+
45
+ const counter = await page.evaluate(() => window.__COUNTER);
46
+ expect(counter).toBe(2);
47
+ });
95
48
  });
96
49
 
97
- it('disables button when clicked when in a form', async () => {
98
- await setTestPage(
99
- '/test',
100
- `
101
- <form onsubmit="return false;">
102
- ${renderComponent('button', { id: 'test-button', text: 'Submit', variants: 'loader' })}
103
- </form>
104
- `,
105
- );
106
-
107
- await page.click('#test-button');
50
+ describe('mode: loader', () => {
51
+ it('disables button when clicked', async () => {
52
+ await setTestPage(
53
+ '/test',
54
+ renderComponent('button', {
55
+ id: 'test-button',
56
+ text: 'Submit',
57
+ variants: 'loader',
58
+ }),
59
+ );
60
+
61
+ await page.click('#test-button');
62
+
63
+ const isButtonDisabled = await page.evaluate(() => document.querySelector('#test-button').getAttribute('disabled'));
64
+ expect(isButtonDisabled).toBe('true');
65
+ });
108
66
 
109
- const isButtonDisabled = (await page.$('#test-button[disabled]')) !== null;
110
- expect(isButtonDisabled).toBe(true);
111
- });
67
+ it('initialised without loading style applied', async () => {
68
+ await setTestPage(
69
+ '/test',
70
+ renderComponent('button', {
71
+ id: 'test-button',
72
+ text: 'Submit',
73
+ variants: 'loader',
74
+ }),
75
+ );
76
+
77
+ const hasIsLoadingClass = await page.evaluate(() =>
78
+ document.querySelector('#test-button').classList.contains('ons-is-loading'),
79
+ );
80
+ expect(hasIsLoadingClass).toBe(false);
81
+ });
112
82
 
113
- it('initialised without loading style applied when in a form', async () => {
114
- await setTestPage(
115
- '/test',
116
- `
117
- <form>
118
- ${renderComponent('button', { id: 'test-button', text: 'Submit', variants: 'loader' })}
119
- </form>
120
- `,
121
- );
122
-
123
- const hasIsLoadingClass = await page.evaluate(() => document.querySelector('#test-button').classList.contains('ons-is-loading'));
124
- expect(hasIsLoadingClass).toBe(false);
125
- });
83
+ it('applies loading style when clicked', async () => {
84
+ await setTestPage(
85
+ '/test',
86
+ renderComponent('button', {
87
+ id: 'test-button',
88
+ text: 'Submit',
89
+ variants: 'loader',
90
+ }),
91
+ );
92
+
93
+ await page.click('#test-button');
94
+
95
+ const hasIsLoadingClass = await page.evaluate(() =>
96
+ document.querySelector('#test-button').classList.contains('ons-is-loading'),
97
+ );
98
+ expect(hasIsLoadingClass).toBe(true);
99
+ });
126
100
 
127
- it('applies loading style when clicked when in a form', async () => {
128
- await setTestPage(
129
- '/test',
130
- `
131
- <form onsubmit="return false;">
132
- ${renderComponent('button', { id: 'test-button', text: 'Submit', variants: 'loader' })}
133
- </form>
134
- `,
135
- );
101
+ it('disables button when clicked when in a form', async () => {
102
+ await setTestPage(
103
+ '/test',
104
+ `
105
+ <form onsubmit="return false;">
106
+ ${renderComponent('button', { id: 'test-button', text: 'Submit', variants: 'loader' })}
107
+ </form>
108
+ `,
109
+ );
136
110
 
137
- await page.click('#test-button');
111
+ await page.click('#test-button');
138
112
 
139
- const hasIsLoadingClass = await page.evaluate(() => document.querySelector('#test-button').classList.contains('ons-is-loading'));
140
- expect(hasIsLoadingClass).toBe(true);
141
- });
142
- });
143
-
144
- describe('mode: timer', () => {
145
- it('allow intentional repeated submissions', async () => {
146
- await setTestPage(
147
- '/test',
148
- renderComponent('button', {
149
- id: 'test-button',
150
- variants: 'timer',
151
- text: 'Submit',
152
- }),
153
- );
154
-
155
- await page.evaluate(() => {
156
- window.__COUNTER = 0;
157
- document.querySelector('#test-button').addEventListener('click', (event) => {
158
- window.__COUNTER++;
159
- event.preventDefault();
113
+ const isButtonDisabled = (await page.$('#test-button[disabled]')) !== null;
114
+ expect(isButtonDisabled).toBe(true);
160
115
  });
161
- });
162
116
 
163
- await page.click('#test-button');
164
- await page.click('#test-button', { delay: 1000 });
117
+ it('initialised without loading style applied when in a form', async () => {
118
+ await setTestPage(
119
+ '/test',
120
+ `
121
+ <form>
122
+ ${renderComponent('button', { id: 'test-button', text: 'Submit', variants: 'loader' })}
123
+ </form>
124
+ `,
125
+ );
126
+
127
+ const hasIsLoadingClass = await page.evaluate(() =>
128
+ document.querySelector('#test-button').classList.contains('ons-is-loading'),
129
+ );
130
+ expect(hasIsLoadingClass).toBe(false);
131
+ });
165
132
 
166
- const counter = await page.evaluate(() => window.__COUNTER);
167
- expect(counter).toBe(2);
133
+ it('applies loading style when clicked when in a form', async () => {
134
+ await setTestPage(
135
+ '/test',
136
+ `
137
+ <form onsubmit="return false;">
138
+ ${renderComponent('button', { id: 'test-button', text: 'Submit', variants: 'loader' })}
139
+ </form>
140
+ `,
141
+ );
142
+
143
+ await page.click('#test-button');
144
+
145
+ const hasIsLoadingClass = await page.evaluate(() =>
146
+ document.querySelector('#test-button').classList.contains('ons-is-loading'),
147
+ );
148
+ expect(hasIsLoadingClass).toBe(true);
149
+ });
168
150
  });
169
151
 
170
- it('prevents unintentional repeated submissions', async () => {
171
- await setTestPage(
172
- '/test',
173
- renderComponent('button', {
174
- id: 'test-button',
175
- variants: 'timer',
176
- text: 'Submit',
177
- }),
178
- );
179
-
180
- await page.evaluate(() => {
181
- window.__COUNTER = 0;
182
- document.querySelector('#test-button').addEventListener('click', (event) => {
183
- window.__COUNTER++;
184
- event.preventDefault();
152
+ describe('mode: timer', () => {
153
+ it('allow intentional repeated submissions', async () => {
154
+ await setTestPage(
155
+ '/test',
156
+ renderComponent('button', {
157
+ id: 'test-button',
158
+ variants: 'timer',
159
+ text: 'Submit',
160
+ }),
161
+ );
162
+
163
+ await page.evaluate(() => {
164
+ window.__COUNTER = 0;
165
+ document.querySelector('#test-button').addEventListener('click', (event) => {
166
+ window.__COUNTER++;
167
+ event.preventDefault();
168
+ });
169
+ });
170
+
171
+ await page.click('#test-button');
172
+ await page.click('#test-button', { delay: 1000 });
173
+
174
+ const counter = await page.evaluate(() => window.__COUNTER);
175
+ expect(counter).toBe(2);
185
176
  });
186
- });
187
-
188
- await page.click('#test-button');
189
- await page.click('#test-button');
190
177
 
191
- const counter = await page.evaluate(() => window.__COUNTER);
192
- expect(counter).toBe(1);
193
- });
194
-
195
- it('allow intentional repeated submissions when in a form', async () => {
196
- await setTestPage(
197
- '/test',
198
- `
199
- <form>
200
- ${renderComponent('button', { id: 'test-button', variants: 'timer', text: 'Submit' })}
201
- </form>
202
- `,
203
- );
204
-
205
- await page.evaluate(() => {
206
- window.__COUNTER = 0;
207
- document.querySelector('form').addEventListener('submit', (event) => {
208
- window.__COUNTER++;
209
- event.preventDefault();
178
+ it('prevents unintentional repeated submissions', async () => {
179
+ await setTestPage(
180
+ '/test',
181
+ renderComponent('button', {
182
+ id: 'test-button',
183
+ variants: 'timer',
184
+ text: 'Submit',
185
+ }),
186
+ );
187
+
188
+ await page.evaluate(() => {
189
+ window.__COUNTER = 0;
190
+ document.querySelector('#test-button').addEventListener('click', (event) => {
191
+ window.__COUNTER++;
192
+ event.preventDefault();
193
+ });
194
+ });
195
+
196
+ await page.click('#test-button');
197
+ await page.click('#test-button');
198
+
199
+ const counter = await page.evaluate(() => window.__COUNTER);
200
+ expect(counter).toBe(1);
210
201
  });
211
- });
212
202
 
213
- await page.click('#test-button');
214
- await page.click('#test-button', { delay: 1000 });
203
+ it('allow intentional repeated submissions when in a form', async () => {
204
+ await setTestPage(
205
+ '/test',
206
+ `
207
+ <form>
208
+ ${renderComponent('button', { id: 'test-button', variants: 'timer', text: 'Submit' })}
209
+ </form>
210
+ `,
211
+ );
212
+
213
+ await page.evaluate(() => {
214
+ window.__COUNTER = 0;
215
+ document.querySelector('form').addEventListener('submit', (event) => {
216
+ window.__COUNTER++;
217
+ event.preventDefault();
218
+ });
219
+ });
220
+
221
+ await page.click('#test-button');
222
+ await page.click('#test-button', { delay: 1000 });
223
+
224
+ const counter = await page.evaluate(() => window.__COUNTER);
225
+ expect(counter).toBe(2);
226
+ });
215
227
 
216
- const counter = await page.evaluate(() => window.__COUNTER);
217
- expect(counter).toBe(2);
228
+ it('prevents unintentional repeated submissions when in a form', async () => {
229
+ await setTestPage(
230
+ '/test',
231
+ `
232
+ <form>
233
+ ${renderComponent('button', { id: 'test-button', variants: 'timer', text: 'Submit' })}
234
+ </form>
235
+ `,
236
+ );
237
+
238
+ await page.evaluate(() => {
239
+ window.__COUNTER = 0;
240
+ document.querySelector('form').addEventListener('submit', (event) => {
241
+ window.__COUNTER++;
242
+ event.preventDefault();
243
+ });
244
+ });
245
+
246
+ await page.click('#test-button');
247
+ await page.click('#test-button');
248
+
249
+ const counter = await page.evaluate(() => window.__COUNTER);
250
+ expect(counter).toBe(1);
251
+ });
218
252
  });
219
253
 
220
- it('prevents unintentional repeated submissions when in a form', async () => {
221
- await setTestPage(
222
- '/test',
223
- `
224
- <form>
225
- ${renderComponent('button', { id: 'test-button', variants: 'timer', text: 'Submit' })}
226
- </form>
227
- `,
228
- );
229
-
230
- await page.evaluate(() => {
231
- window.__COUNTER = 0;
232
- document.querySelector('form').addEventListener('submit', (event) => {
233
- window.__COUNTER++;
234
- event.preventDefault();
254
+ describe('style: print', () => {
255
+ it('displays the browsers print interface', async () => {
256
+ await setTestPage(
257
+ '/test',
258
+ renderComponent('button', {
259
+ id: 'test-button',
260
+ type: 'button',
261
+ text: 'Print this page',
262
+ variants: 'print',
263
+ }),
264
+ );
265
+
266
+ await page.evaluate(() => {
267
+ window.print = () => (window.wasPrinted = 'yes');
268
+ });
269
+
270
+ await page.click('#test-button');
271
+
272
+ const wasPrinted = await page.evaluate(() => window.wasPrinted);
273
+ expect(wasPrinted).toBe('yes');
235
274
  });
236
- });
237
-
238
- await page.click('#test-button');
239
- await page.click('#test-button');
240
-
241
- const counter = await page.evaluate(() => window.__COUNTER);
242
- expect(counter).toBe(1);
243
- });
244
- });
245
-
246
- describe('style: print', () => {
247
- it('displays the browsers print interface', async () => {
248
- await setTestPage(
249
- '/test',
250
- renderComponent('button', {
251
- id: 'test-button',
252
- type: 'button',
253
- text: 'Print this page',
254
- variants: 'print',
255
- }),
256
- );
257
-
258
- await page.evaluate(() => {
259
- window.print = () => (window.wasPrinted = 'yes');
260
- });
261
-
262
- await page.click('#test-button');
263
-
264
- const wasPrinted = await page.evaluate(() => window.wasPrinted);
265
- expect(wasPrinted).toBe('yes');
266
275
  });
267
- });
268
276
  });
@@ -1,8 +1,8 @@
1
1
  .ons-call-to-action {
2
- background: var(--ons-color-cta-bg);
3
- padding: 0.85rem 0;
2
+ background: var(--ons-color-cta-bg);
3
+ padding: 0.85rem 0;
4
4
 
5
- &__heading {
6
- padding-right: 0.2rem;
7
- }
5
+ &__heading {
6
+ padding-right: 0.2rem;
7
+ }
8
8
  }
@@ -6,43 +6,43 @@ import axe from '../../tests/helpers/axe';
6
6
  import { renderComponent, templateFaker } from '../../tests/helpers/rendering';
7
7
 
8
8
  const EXAMPLE_CALL_TO_ACTION = {
9
- headingText: 'Call to action heading.',
10
- paragraphText: 'Descriptive text about call to action',
11
- button: {
12
- text: 'Start',
13
- url: 'https://example.com/start',
14
- },
9
+ headingText: 'Call to action heading.',
10
+ paragraphText: 'Descriptive text about call to action',
11
+ button: {
12
+ text: 'Start',
13
+ url: 'https://example.com/start',
14
+ },
15
15
  };
16
16
 
17
17
  describe('macro: call-to-action', () => {
18
- it('passes jest-axe checks', async () => {
19
- const $ = cheerio.load(renderComponent('call-to-action', EXAMPLE_CALL_TO_ACTION));
18
+ it('passes jest-axe checks', async () => {
19
+ const $ = cheerio.load(renderComponent('call-to-action', EXAMPLE_CALL_TO_ACTION));
20
20
 
21
- const results = await axe($.html());
22
- expect(results).toHaveNoViolations();
23
- });
21
+ const results = await axe($.html());
22
+ expect(results).toHaveNoViolations();
23
+ });
24
24
 
25
- it('has the provided `headingText`', () => {
26
- const $ = cheerio.load(renderComponent('call-to-action', EXAMPLE_CALL_TO_ACTION));
25
+ it('has the provided `headingText`', () => {
26
+ const $ = cheerio.load(renderComponent('call-to-action', EXAMPLE_CALL_TO_ACTION));
27
27
 
28
- const headingText = $('.ons-call-to-action__heading').text().trim();
29
- expect(headingText).toBe('Call to action heading.');
30
- });
28
+ const headingText = $('.ons-call-to-action__heading').text().trim();
29
+ expect(headingText).toBe('Call to action heading.');
30
+ });
31
31
 
32
- it('has the provided `paragraphText`', () => {
33
- const $ = cheerio.load(renderComponent('call-to-action', EXAMPLE_CALL_TO_ACTION));
32
+ it('has the provided `paragraphText`', () => {
33
+ const $ = cheerio.load(renderComponent('call-to-action', EXAMPLE_CALL_TO_ACTION));
34
34
 
35
- const paragraphText = $('.ons-call-to-action__text').text().trim();
36
- expect(paragraphText).toBe('Descriptive text about call to action');
37
- });
35
+ const paragraphText = $('.ons-call-to-action__text').text().trim();
36
+ expect(paragraphText).toBe('Descriptive text about call to action');
37
+ });
38
38
 
39
- it('outputs the expected call-to-action button', () => {
40
- const faker = templateFaker();
41
- const buttonSpy = faker.spy('button');
39
+ it('outputs the expected call-to-action button', () => {
40
+ const faker = templateFaker();
41
+ const buttonSpy = faker.spy('button');
42
42
 
43
- faker.renderComponent('call-to-action', EXAMPLE_CALL_TO_ACTION);
43
+ faker.renderComponent('call-to-action', EXAMPLE_CALL_TO_ACTION);
44
44
 
45
- expect(buttonSpy.occurrences[0]).toHaveProperty('text', 'Start');
46
- expect(buttonSpy.occurrences[0]).toHaveProperty('url', 'https://example.com/start');
47
- });
45
+ expect(buttonSpy.occurrences[0]).toHaveProperty('text', 'Start');
46
+ expect(buttonSpy.occurrences[0]).toHaveProperty('url', 'https://example.com/start');
47
+ });
48
48
  });
@@ -1,32 +1,32 @@
1
1
  .ons-card {
2
- margin: 0 0 2rem;
3
- width: 100%;
2
+ margin: 0 0 2rem;
3
+ width: 100%;
4
4
 
5
- &__link {
6
- display: flex;
7
- flex-direction: column;
8
- margin-bottom: 1rem;
9
- width: fit-content;
5
+ &__link {
6
+ display: flex;
7
+ flex-direction: column;
8
+ margin-bottom: 1rem;
9
+ width: fit-content;
10
10
 
11
- & > .ons-card__title {
12
- margin-bottom: 0;
11
+ > .ons-card__title {
12
+ margin-bottom: 0;
13
+ }
13
14
  }
14
- }
15
15
 
16
- &__link:hover {
17
- text-decoration-thickness: 3px;
18
- }
16
+ &__link:hover {
17
+ text-decoration-thickness: 3px;
18
+ }
19
19
 
20
- &__title {
21
- // This is to allow the focus state for multi lined title links to render the focus style correctly.
22
- // This should be corrected when the typography scale is improved.
23
- line-height: 1.65 !important;
24
- }
20
+ &__title {
21
+ // This is to allow the focus state for multi lined title links to render the focus style correctly.
22
+ // This should be corrected when the typography scale is improved.
23
+ line-height: 1.65 !important;
24
+ }
25
25
 
26
- @include mq(m) {
27
- margin: 0;
28
- .ons-grid__col & {
29
- padding-right: 1rem;
26
+ @include mq(m) {
27
+ margin: 0;
28
+ .ons-grid__col & {
29
+ padding-right: 1rem;
30
+ }
30
31
  }
31
- }
32
32
  }