@govtechsg/sgds-web-component 0.0.10 → 0.0.11

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 (251) hide show
  1. package/package.json +7 -64
  2. package/.github/workflows/publish-latest.yml +0 -22
  3. package/.github/workflows/publish-pr.yml +0 -28
  4. package/.husky/commit-msg +0 -4
  5. package/.husky/prepare-commit-msg +0 -8
  6. package/.storybook/main.js +0 -16
  7. package/.storybook/preview-head.html +0 -11
  8. package/.storybook/preview.js +0 -9
  9. package/.vscode/settings.json +0 -7
  10. package/CONTRIBUTING.md +0 -56
  11. package/LICENSE +0 -20
  12. package/amplify.yml +0 -22
  13. package/commitlint.config.js +0 -1
  14. package/coverage/lcov-report/base.css +0 -224
  15. package/coverage/lcov-report/block-navigation.js +0 -87
  16. package/coverage/lcov-report/button-element.scss.html +0 -112
  17. package/coverage/lcov-report/button-element.ts.html +0 -145
  18. package/coverage/lcov-report/favicon.png +0 -0
  19. package/coverage/lcov-report/index.html +0 -116
  20. package/coverage/lcov-report/prettify.css +0 -1
  21. package/coverage/lcov-report/prettify.js +0 -2
  22. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  23. package/coverage/lcov-report/sorter.js +0 -196
  24. package/coverage/lcov.info +0 -32
  25. package/index.html +0 -430
  26. package/mocks/dropdown.d.ts +0 -4
  27. package/mocks/dropdown.ts +0 -27
  28. package/mocks/link.d.ts +0 -3
  29. package/mocks/link.ts +0 -6
  30. package/rollup.config.js +0 -73
  31. package/rollup.test.config.js +0 -42
  32. package/scripts/buildUtils.js +0 -30
  33. package/scripts/frankBuild.js +0 -49
  34. package/src/Button/index.ts +0 -1
  35. package/src/Button/sgds-button.scss +0 -28
  36. package/src/Button/sgds-button.ts +0 -153
  37. package/src/Card/index.ts +0 -1
  38. package/src/Card/sgds-action-card.scss +0 -27
  39. package/src/Card/sgds-action-card.ts +0 -115
  40. package/src/Checkbox/index.ts +0 -1
  41. package/src/Checkbox/sgds-checkbox.scss +0 -4
  42. package/src/Checkbox/sgds-checkbox.ts +0 -149
  43. package/src/Dropdown/index.ts +0 -3
  44. package/src/Dropdown/sgds-dropdown-item.ts +0 -39
  45. package/src/Dropdown/sgds-dropdown.scss +0 -5
  46. package/src/Dropdown/sgds-dropdown.ts +0 -54
  47. package/src/Footer/index.ts +0 -3
  48. package/src/Footer/sgds-footer.scss +0 -5
  49. package/src/Footer/sgds-footer.ts +0 -121
  50. package/src/Input/index.ts +0 -1
  51. package/src/Input/sgds-input.scss +0 -20
  52. package/src/Input/sgds-input.ts +0 -178
  53. package/src/Mainnav/index.ts +0 -4
  54. package/src/Mainnav/sgds-mainnav-dropdown.scss +0 -13
  55. package/src/Mainnav/sgds-mainnav-dropdown.ts +0 -45
  56. package/src/Mainnav/sgds-mainnav-item.scss +0 -24
  57. package/src/Mainnav/sgds-mainnav-item.ts +0 -8
  58. package/src/Mainnav/sgds-mainnav.scss +0 -39
  59. package/src/Mainnav/sgds-mainnav.ts +0 -183
  60. package/src/Masthead/index.ts +0 -1
  61. package/src/Masthead/sgds-masthead.scss +0 -217
  62. package/src/Masthead/sgds-masthead.ts +0 -189
  63. package/src/Modal/index.ts +0 -1
  64. package/src/Modal/sgds-modal.scss +0 -128
  65. package/src/Modal/sgds-modal.ts +0 -309
  66. package/src/QuantityToggle/index.ts +0 -1
  67. package/src/QuantityToggle/sgds-quantitytoggle.scss +0 -10
  68. package/src/QuantityToggle/sgds-quantitytoggle.ts +0 -130
  69. package/src/Radio/index.ts +0 -2
  70. package/src/Radio/sgds-radio.scss +0 -5
  71. package/src/Radio/sgds-radio.ts +0 -120
  72. package/src/Radio/sgds-radiogroup.scss +0 -22
  73. package/src/Radio/sgds-radiogroup.ts +0 -221
  74. package/src/Sidenav/index.ts +0 -4
  75. package/src/Sidenav/sgds-sidenav-item.scss +0 -73
  76. package/src/Sidenav/sgds-sidenav-item.ts +0 -145
  77. package/src/Sidenav/sgds-sidenav-link.scss +0 -25
  78. package/src/Sidenav/sgds-sidenav-link.ts +0 -8
  79. package/src/Sidenav/sgds-sidenav.scss +0 -6
  80. package/src/Sidenav/sgds-sidenav.ts +0 -33
  81. package/src/Tab/index.ts +0 -3
  82. package/src/Tab/sgds-tab.scss +0 -84
  83. package/src/Tab/sgds-tab.ts +0 -87
  84. package/src/Tab/sgds-tabgroup.scss +0 -198
  85. package/src/Tab/sgds-tabgroup.ts +0 -295
  86. package/src/Tab/sgds-tabpanel.scss +0 -12
  87. package/src/Tab/sgds-tabpanel.ts +0 -55
  88. package/src/Textarea/index.ts +0 -1
  89. package/src/Textarea/sgds-textarea.scss +0 -23
  90. package/src/Textarea/sgds-textarea.ts +0 -201
  91. package/src/index.ts +0 -16
  92. package/src/utils/animate.ts +0 -69
  93. package/src/utils/animation-registry.ts +0 -71
  94. package/src/utils/base.scss +0 -14
  95. package/src/utils/breakpoints.ts +0 -5
  96. package/src/utils/card-element.ts +0 -42
  97. package/src/utils/components.style.scss +0 -531
  98. package/src/utils/defaultvalue.ts +0 -51
  99. package/src/utils/dropdown-element.ts +0 -244
  100. package/src/utils/event.ts +0 -13
  101. package/src/utils/form.ts +0 -183
  102. package/src/utils/generateId.ts +0 -4
  103. package/src/utils/link-element.ts +0 -34
  104. package/src/utils/mergeDeep.ts +0 -22
  105. package/src/utils/modal.ts +0 -64
  106. package/src/utils/object.ts +0 -2
  107. package/src/utils/offset.ts +0 -6
  108. package/src/utils/scroll.ts +0 -57
  109. package/src/utils/sgds-element.ts +0 -18
  110. package/src/utils/slot.ts +0 -102
  111. package/src/utils/tabbable.ts +0 -81
  112. package/src/utils/watch.ts +0 -62
  113. package/stories/ActionCard.stories.mdx +0 -199
  114. package/stories/Button.stories.mdx +0 -194
  115. package/stories/Checkbox.stories.mdx +0 -196
  116. package/stories/Dropdown.stories.mdx +0 -152
  117. package/stories/Footer.stories.mdx +0 -261
  118. package/stories/Input.stories.mdx +0 -236
  119. package/stories/MainNav.stories.mdx +0 -169
  120. package/stories/Masthead.stories.mdx +0 -112
  121. package/stories/Modal.stories.mdx +0 -103
  122. package/stories/QuantityToggle.stories.mdx +0 -97
  123. package/stories/Radio.stories.mdx +0 -262
  124. package/stories/Sample.stories.js +0 -29
  125. package/stories/Sample.stories.mdx +0 -33
  126. package/stories/SideNav.stories.mdx +0 -245
  127. package/stories/common.js +0 -185
  128. package/stories/textarea.stories.mdx +0 -253
  129. package/test/button.element.test.ts +0 -185
  130. package/test/checkbox.test.ts +0 -240
  131. package/test/dropdown.test.ts +0 -637
  132. package/test/footer.test.ts +0 -181
  133. package/test/generateId.test.ts +0 -18
  134. package/test/input.element.test.ts +0 -316
  135. package/test/link-element.test.ts +0 -38
  136. package/test/mainnav.test.ts +0 -313
  137. package/test/masthead.test.ts +0 -116
  138. package/test/modal.test.ts +0 -149
  139. package/test/quantitytoggle.test.ts +0 -76
  140. package/test/radio.test.ts +0 -310
  141. package/test/selectable-card.test.ts +0 -159
  142. package/test/sidenav.test.ts +0 -390
  143. package/test/tab.test.ts +0 -76
  144. package/test/textarea.test.ts +0 -126
  145. package/tsconfig.json +0 -26
  146. package/tsconfig.test.json +0 -24
  147. package/typings/scss.d.ts +0 -5
  148. package/web-dev-server.config.mjs +0 -7
  149. package/web-test-runner.config.mjs +0 -47
  150. /package/{lib/Button → Button}/index.d.ts +0 -0
  151. /package/{lib/Button → Button}/index.js +0 -0
  152. /package/{lib/Button → Button}/index.js.map +0 -0
  153. /package/{lib/Button → Button}/package.json +0 -0
  154. /package/{lib/Button → Button}/sgds-button.d.ts +0 -0
  155. /package/{lib/Card → Card}/index.d.ts +0 -0
  156. /package/{lib/Card → Card}/index.js +0 -0
  157. /package/{lib/Card → Card}/index.js.map +0 -0
  158. /package/{lib/Card → Card}/package.json +0 -0
  159. /package/{lib/Card → Card}/sgds-action-card.d.ts +0 -0
  160. /package/{lib/Checkbox → Checkbox}/index.d.ts +0 -0
  161. /package/{lib/Checkbox → Checkbox}/index.js +0 -0
  162. /package/{lib/Checkbox → Checkbox}/index.js.map +0 -0
  163. /package/{lib/Checkbox → Checkbox}/package.json +0 -0
  164. /package/{lib/Checkbox → Checkbox}/sgds-checkbox.d.ts +0 -0
  165. /package/{lib/Dropdown → Dropdown}/index.d.ts +0 -0
  166. /package/{lib/Dropdown → Dropdown}/index.js +0 -0
  167. /package/{lib/Dropdown → Dropdown}/index.js.map +0 -0
  168. /package/{lib/Dropdown → Dropdown}/package.json +0 -0
  169. /package/{lib/Dropdown → Dropdown}/sgds-dropdown-item.d.ts +0 -0
  170. /package/{lib/Dropdown → Dropdown}/sgds-dropdown.d.ts +0 -0
  171. /package/{lib/Footer → Footer}/index.d.ts +0 -0
  172. /package/{lib/Footer → Footer}/index.js +0 -0
  173. /package/{lib/Footer → Footer}/index.js.map +0 -0
  174. /package/{lib/Footer → Footer}/package.json +0 -0
  175. /package/{lib/Footer → Footer}/sgds-footer.d.ts +0 -0
  176. /package/{lib/Input → Input}/index.d.ts +0 -0
  177. /package/{lib/Input → Input}/index.js +0 -0
  178. /package/{lib/Input → Input}/index.js.map +0 -0
  179. /package/{lib/Input → Input}/package.json +0 -0
  180. /package/{lib/Input → Input}/sgds-input.d.ts +0 -0
  181. /package/{lib/Mainnav → Mainnav}/index.d.ts +0 -0
  182. /package/{lib/Mainnav → Mainnav}/index.js +0 -0
  183. /package/{lib/Mainnav → Mainnav}/index.js.map +0 -0
  184. /package/{lib/Mainnav → Mainnav}/package.json +0 -0
  185. /package/{lib/Mainnav → Mainnav}/sgds-mainnav-dropdown.d.ts +0 -0
  186. /package/{lib/Mainnav → Mainnav}/sgds-mainnav-item.d.ts +0 -0
  187. /package/{lib/Mainnav → Mainnav}/sgds-mainnav.d.ts +0 -0
  188. /package/{lib/Masthead → Masthead}/index.d.ts +0 -0
  189. /package/{lib/Masthead → Masthead}/index.js +0 -0
  190. /package/{lib/Masthead → Masthead}/index.js.map +0 -0
  191. /package/{lib/Masthead → Masthead}/package.json +0 -0
  192. /package/{lib/Masthead → Masthead}/sgds-masthead.d.ts +0 -0
  193. /package/{lib/Modal → Modal}/index.d.ts +0 -0
  194. /package/{lib/Modal → Modal}/index.js +0 -0
  195. /package/{lib/Modal → Modal}/index.js.map +0 -0
  196. /package/{lib/Modal → Modal}/package.json +0 -0
  197. /package/{lib/Modal → Modal}/sgds-modal.d.ts +0 -0
  198. /package/{lib/QuantityToggle → QuantityToggle}/index.d.ts +0 -0
  199. /package/{lib/QuantityToggle → QuantityToggle}/index.js +0 -0
  200. /package/{lib/QuantityToggle → QuantityToggle}/index.js.map +0 -0
  201. /package/{lib/QuantityToggle → QuantityToggle}/package.json +0 -0
  202. /package/{lib/QuantityToggle → QuantityToggle}/sgds-quantitytoggle.d.ts +0 -0
  203. /package/{lib/Radio → Radio}/index.d.ts +0 -0
  204. /package/{lib/Radio → Radio}/index.js +0 -0
  205. /package/{lib/Radio → Radio}/index.js.map +0 -0
  206. /package/{lib/Radio → Radio}/package.json +0 -0
  207. /package/{lib/Radio → Radio}/sgds-radio.d.ts +0 -0
  208. /package/{lib/Radio → Radio}/sgds-radiogroup.d.ts +0 -0
  209. /package/{lib/Sidenav → Sidenav}/index.d.ts +0 -0
  210. /package/{lib/Sidenav → Sidenav}/index.js +0 -0
  211. /package/{lib/Sidenav → Sidenav}/index.js.map +0 -0
  212. /package/{lib/Sidenav → Sidenav}/package.json +0 -0
  213. /package/{lib/Sidenav → Sidenav}/sgds-sidenav-item.d.ts +0 -0
  214. /package/{lib/Sidenav → Sidenav}/sgds-sidenav-link.d.ts +0 -0
  215. /package/{lib/Sidenav → Sidenav}/sgds-sidenav.d.ts +0 -0
  216. /package/{lib/Tab → Tab}/index.d.ts +0 -0
  217. /package/{lib/Tab → Tab}/index.js +0 -0
  218. /package/{lib/Tab → Tab}/index.js.map +0 -0
  219. /package/{lib/Tab → Tab}/package.json +0 -0
  220. /package/{lib/Tab → Tab}/sgds-tab.d.ts +0 -0
  221. /package/{lib/Tab → Tab}/sgds-tabgroup.d.ts +0 -0
  222. /package/{lib/Tab → Tab}/sgds-tabpanel.d.ts +0 -0
  223. /package/{lib/Textarea → Textarea}/index.d.ts +0 -0
  224. /package/{lib/Textarea → Textarea}/index.js +0 -0
  225. /package/{lib/Textarea → Textarea}/index.js.map +0 -0
  226. /package/{lib/Textarea → Textarea}/package.json +0 -0
  227. /package/{lib/Textarea → Textarea}/sgds-textarea.d.ts +0 -0
  228. /package/{lib/index.d.ts → index.d.ts} +0 -0
  229. /package/{lib/index.js → index.js} +0 -0
  230. /package/{lib/index.js.map → index.js.map} +0 -0
  231. /package/{lib/umd → umd}/index.js +0 -0
  232. /package/{lib/umd → umd}/index.js.map +0 -0
  233. /package/{lib/utils → utils}/animate.d.ts +0 -0
  234. /package/{lib/utils → utils}/animation-registry.d.ts +0 -0
  235. /package/{lib/utils → utils}/breakpoints.d.ts +0 -0
  236. /package/{lib/utils → utils}/card-element.d.ts +0 -0
  237. /package/{lib/utils → utils}/defaultvalue.d.ts +0 -0
  238. /package/{lib/utils → utils}/dropdown-element.d.ts +0 -0
  239. /package/{lib/utils → utils}/event.d.ts +0 -0
  240. /package/{lib/utils → utils}/form.d.ts +0 -0
  241. /package/{lib/utils → utils}/generateId.d.ts +0 -0
  242. /package/{lib/utils → utils}/link-element.d.ts +0 -0
  243. /package/{lib/utils → utils}/mergeDeep.d.ts +0 -0
  244. /package/{lib/utils → utils}/modal.d.ts +0 -0
  245. /package/{lib/utils → utils}/object.d.ts +0 -0
  246. /package/{lib/utils → utils}/offset.d.ts +0 -0
  247. /package/{lib/utils → utils}/scroll.d.ts +0 -0
  248. /package/{lib/utils → utils}/sgds-element.d.ts +0 -0
  249. /package/{lib/utils → utils}/slot.d.ts +0 -0
  250. /package/{lib/utils → utils}/tabbable.d.ts +0 -0
  251. /package/{lib/utils → utils}/watch.d.ts +0 -0
@@ -1,310 +0,0 @@
1
- import { SgdsRadio, SgdsRadioGroup } from "../src/Radio";
2
- import "../src/Radio";
3
- import "../src/Button";
4
- import {
5
- fixture,
6
- assert,
7
- expect,
8
- waitUntil,
9
- elementUpdated,
10
- aTimeout,
11
- fixtureCleanup,
12
- triggerFocusFor,
13
- } from "@open-wc/testing";
14
- import { html } from "lit";
15
- import sinon from "sinon";
16
- import { SgdsButton } from "../src/Button";
17
- import { sendKeys } from "@web/test-runner-commands";
18
-
19
- describe("<sgds-radio>", () => {
20
- afterEach(() => fixtureCleanup());
21
- it("is defined", () => {
22
- const el = document.createElement("sgds-radio");
23
- assert.instanceOf(el, SgdsRadio);
24
- });
25
-
26
- it("by default, tabindex='-1'", async () => {
27
- const el = await fixture(html`<sgds-radio></sgds-radio>`);
28
- expect(el).to.have.attribute("tabindex", "-1");
29
- });
30
-
31
- it("when isInline prop is passed, radio class should have class .form-check-inline", async () => {
32
- const el = await fixture(html`<sgds-radio isInline></sgds-radio>`);
33
- const radio = el.shadowRoot?.querySelector("div");
34
- expect(radio?.classList.value).to.contain("form-check-inline");
35
- });
36
-
37
- it("should be able to pass in value to attributes(id/for pair)", async () => {
38
- const el = await fixture(
39
- html`<sgds-radio radioId="radio-123"></sgds-radio>`
40
- );
41
- const input = el.shadowRoot?.querySelector("input");
42
- expect(input).to.have.attribute("id", "radio-123");
43
- const label = el.shadowRoot?.querySelector("label");
44
- expect(label).to.have.attribute("for", "radio-123");
45
- });
46
-
47
- it("should be disabled with the disabled attribute & aria-disabled to be true", async () => {
48
- const el = await fixture(html`<sgds-radio disabled></sgds-radio>`);
49
- const radio = el.shadowRoot?.querySelector("input");
50
- expect(radio?.disabled).to.be.true;
51
- expect(radio).to.have.attribute("aria-disabled", "true");
52
- });
53
-
54
- it("should render aria-label attribute value", async () => {
55
- const el = await fixture(html`<sgds-radio ariaLabel="label"></sgds-radio>`);
56
- const radio = el.shadowRoot?.querySelector("label");
57
- expect(radio).to.have.attribute("aria-label", "label");
58
- });
59
-
60
- it("should be able to pass in value to value attribute", async () => {
61
- const el = await fixture(html`<sgds-radio value="3"></sgds-radio>`);
62
- const radio = el.shadowRoot?.querySelector("input");
63
- expect(radio).to.have.attribute("value", "3");
64
- });
65
- });
66
-
67
- describe("<sgds-radiogroup>", () => {
68
- it("is defined", () => {
69
- const el = document.createElement("sgds-radiogroup");
70
- assert.instanceOf(el, SgdsRadioGroup);
71
- });
72
-
73
- it("should render the name attribute when passed", async () => {
74
- const el = await fixture(
75
- html`<sgds-radiogroup name="option"></sgds-radiogroup>`
76
- );
77
- const fieldset = el.shadowRoot?.querySelector("fieldset");
78
- expect(fieldset).to.have.attribute("name", "option");
79
- });
80
-
81
- it("radio2 should have aria-checked to be true when checked", async () => {
82
- const el = await fixture(
83
- html`<sgds-radiogroup name="option"
84
- ><sgds-radio id="radio1" value="1">one</sgds-radio
85
- ><sgds-radio id="radio2" value="2">two</sgds-radio></sgds-radiogroup
86
- >`
87
- );
88
- const radio1 = <SgdsRadio>el.querySelector("sgds-radio#radio1");
89
- const radio2 = <SgdsRadio>el.querySelector("sgds-radio#radio2");
90
- expect(radio1.checked).to.be.false;
91
- expect(radio2.checked).to.be.false;
92
- expect(radio1).to.have.attribute("aria-checked", "false");
93
- expect(radio2).to.have.attribute("aria-checked", "false");
94
-
95
- radio2.click();
96
- await Promise.all([radio1.updateComplete, radio2.updateComplete]);
97
-
98
- expect(radio1.checked).to.be.false;
99
- expect(radio2.checked).to.be.true;
100
- expect(radio2).to.have.attribute("aria-checked", "true");
101
- });
102
-
103
- it("radiogroup should emit sgds-change event when one of the radio is clicked", async () => {
104
- const el = await fixture(
105
- html`<sgds-radiogroup name="option">
106
- <sgds-radio id="radio2" value="2">two</sgds-radio></sgds-radiogroup
107
- >`
108
- );
109
- const toggleHandler = sinon.spy();
110
- el.addEventListener("sgds-change", toggleHandler);
111
- const radio2 = <SgdsRadio>el.querySelector("sgds-radio#radio2");
112
- radio2.click();
113
- await Promise.all([elementUpdated(el)]);
114
- expect(toggleHandler).to.have.been.calledOnce;
115
- });
116
-
117
- it("radiogroup should update and reflect the value for the checked radio", async () => {
118
- const el = await fixture<SgdsRadioGroup>(
119
- html`<sgds-radiogroup id="radiogroup">
120
- <sgds-radio id="radio2" value="2">two</sgds-radio>
121
- </sgds-radiogroup>`
122
- );
123
-
124
- expect(el).to.have.attribute("value", undefined);
125
-
126
- const radio = el.querySelector("sgds-radio");
127
- radio?.click();
128
- await el.updateComplete;
129
- expect(el).to.have.attribute("value", "2");
130
- });
131
-
132
- it("should be invalid state on form submission with required passed in", async () => {
133
- const el = await fixture<HTMLFormElement>(
134
- html`<form>
135
- <sgds-radiogroup id="radiogroup" required>
136
- <sgds-radio id="radio2" value="2">two</sgds-radio>
137
- </sgds-radiogroup>
138
- <sgds-button type="submit">Submit</sgds-button>
139
- </form>`
140
- );
141
-
142
- const button = <SgdsButton>el.querySelector("sgds-button");
143
- button?.click();
144
- await el.updateComplete;
145
- expect(el.reportValidity()).to.be.false;
146
- const radioGroup = <SgdsRadioGroup>el.querySelector("sgds-radiogroup");
147
- expect(radioGroup.invalid).to.be.true;
148
- });
149
-
150
- it("upon validation, it should have invalid feedback with text 'default feedback' by default, and also able to render other text when specified", async () => {
151
- const el = await fixture<SgdsRadioGroup>(
152
- html`
153
- <sgds-radiogroup id="radiogroup" required>
154
- <sgds-radio id="radio2" value="2">two</sgds-radio>
155
- </sgds-radiogroup>
156
- `
157
- );
158
- const invalidFeedback = el.shadowRoot?.querySelector(
159
- "div.invalid-feedback"
160
- );
161
- expect(invalidFeedback?.textContent).to.contain("default feedback");
162
- el.setAttribute("invalidFeedback", "Fill up this field.");
163
- await elementUpdated(el);
164
- expect(invalidFeedback?.textContent).to.contain("Fill up this field.");
165
- });
166
-
167
- it("by default, first radio is tabindex 0", async () => {
168
- const el = await fixture<SgdsRadioGroup>(html`<sgds-radiogroup>
169
- <sgds-radio value="1">one</sgds-radio>
170
- <sgds-radio value="2">two</sgds-radio>
171
- <sgds-radio value="3">three</sgds-radio>
172
- </sgds-radiogroup>`);
173
-
174
- expect(el.querySelectorAll("sgds-radio")[0]).to.have.attribute(
175
- "tabindex",
176
- "0"
177
- );
178
- expect(el.querySelectorAll("sgds-radio")[1]).to.have.attribute(
179
- "tabindex",
180
- "-1"
181
- );
182
- expect(el.querySelectorAll("sgds-radio")[2]).to.have.attribute(
183
- "tabindex",
184
- "-1"
185
- );
186
- });
187
-
188
- it("should toggle tabindex 0 for checked radio & tabindex -1 when unchecked upon clicking", async () => {
189
- const el = await fixture<SgdsRadioGroup>(html`<sgds-radiogroup>
190
- <sgds-radio value="1">one</sgds-radio>
191
- <sgds-radio value="2">two</sgds-radio>
192
- <sgds-radio value="3">three</sgds-radio>
193
- </sgds-radiogroup>`);
194
-
195
- const radio1 = el.querySelectorAll("sgds-radio")[0];
196
- const radio2 = el.querySelectorAll("sgds-radio")[1];
197
- const radio3 = el.querySelectorAll("sgds-radio")[2];
198
-
199
- radio1.click();
200
- await el.updateComplete;
201
-
202
- expect(radio1).to.have.attribute("tabindex", "0");
203
- expect(radio2).to.have.attribute("tabindex", "-1");
204
- expect(radio3).to.have.attribute("tabindex", "-1");
205
-
206
- radio2.click();
207
- await el.updateComplete;
208
-
209
- expect(radio1).to.have.attribute("tabindex", "-1");
210
- expect(radio2).to.have.attribute("tabindex", "0");
211
- expect(radio3).to.have.attribute("tabindex", "-1");
212
- });
213
-
214
- it("clicking label should focus on first radio when radios unchecked", async () => {
215
- const el = await fixture<SgdsRadioGroup>(html`<sgds-radiogroup
216
- label="Hello world"
217
- >
218
- <sgds-radio value="1">one</sgds-radio>
219
- <sgds-radio value="2">two</sgds-radio>
220
- <sgds-radio value="3">three</sgds-radio>
221
- </sgds-radiogroup>`);
222
-
223
- const radio1 = el.querySelectorAll("sgds-radio")[0];
224
-
225
- const label = <HTMLLabelElement>(
226
- el.shadowRoot?.querySelector("label.form-label")
227
- );
228
- label.click();
229
-
230
- await triggerFocusFor(radio1);
231
- expect(document.activeElement === radio1).to.be.true;
232
- });
233
-
234
- it("when a radio is checked, clicking label should focus on the checked radio", async () => {
235
- const el = await fixture<SgdsRadioGroup>(html`<sgds-radiogroup
236
- label="Hello world"
237
- >
238
- <sgds-radio value="1">one</sgds-radio>
239
- <sgds-radio value="2">two</sgds-radio>
240
- <sgds-radio value="3">three</sgds-radio>
241
- </sgds-radiogroup>`);
242
-
243
- const radio2 = el.querySelectorAll("sgds-radio")[1];
244
-
245
- radio2.click();
246
- await el.updateComplete;
247
-
248
- const label = <HTMLLabelElement>(
249
- el.shadowRoot?.querySelector("label.form-label")
250
- );
251
- label.click();
252
-
253
- await triggerFocusFor(radio2);
254
- expect(document.activeElement === radio2).to.be.true;
255
- });
256
-
257
- it("should allow for the following keyboard interactions upon keydown", async () => {
258
- const el = await fixture<SgdsRadioGroup>(html`<sgds-radiogroup
259
- label="Hello world"
260
- >
261
- <sgds-radio value="1">one</sgds-radio>
262
- <sgds-radio value="2">two</sgds-radio>
263
- <sgds-radio value="3">three</sgds-radio>
264
- </sgds-radiogroup>`);
265
-
266
- const radio1 = el.querySelectorAll("sgds-radio")[0];
267
- const radio2 = el.querySelectorAll("sgds-radio")[1];
268
- const radio3 = el.querySelectorAll("sgds-radio")[2];
269
-
270
- const label = <HTMLLabelElement>(
271
- el.shadowRoot?.querySelector("label.form-label")
272
- );
273
- label.click();
274
-
275
- await triggerFocusFor(radio1);
276
- expect(document.activeElement === radio1).to.be.true;
277
-
278
- // spacebar key
279
- await sendKeys({ press: " " });
280
- expect(radio1).to.have.attribute("tabindex", "0");
281
- expect(radio1).to.have.attribute("aria-checked", "true");
282
- expect(el).to.have.attribute("value", "1");
283
-
284
- // arrowright incr index
285
- await sendKeys({ press: "ArrowRight" });
286
- expect(radio2).to.have.attribute("tabindex", "0");
287
- expect(radio2).to.have.attribute("aria-checked", "true");
288
- expect(el).to.have.attribute("value", "2");
289
-
290
- // arrowdown incr index
291
- await sendKeys({ press: "ArrowDown" });
292
- expect(radio3).to.have.attribute("tabindex", "0");
293
- expect(radio3).to.have.attribute("aria-checked", "true");
294
- expect(el).to.have.attribute("value", "3");
295
-
296
- // arrowleft decr index
297
- await sendKeys({ press: "ArrowLeft" });
298
- expect(radio2).to.have.attribute("tabindex", "0");
299
- expect(radio2).to.have.attribute("aria-checked", "true");
300
- expect(el).to.have.attribute("value", "2");
301
-
302
- // arrowup decr index
303
- await sendKeys({ press: "ArrowLeft" });
304
- expect(radio1).to.have.attribute("tabindex", "0");
305
- expect(radio1).to.have.attribute("aria-checked", "true");
306
- expect(el).to.have.attribute("value", "1");
307
- });
308
- });
309
-
310
- // Keyboard interactions (arrowdown, arrowup) --> to keep check on the handleKeyDown() you wrote --> and that it updates the sgds-radio-group
@@ -1,159 +0,0 @@
1
- import {
2
- aTimeout,
3
- expect,
4
- fixture,
5
- html,
6
- oneEvent,
7
- assert,
8
- waitUntil,
9
- elementUpdated,
10
- } from "@open-wc/testing";
11
- import sinon from "sinon";
12
- import "../src/Card";
13
- import { SgdsActionCard } from "../src/Card";
14
- import "../src/Checkbox";
15
- import "../src/Radio";
16
- import { SgdsCheckbox } from "../src/Checkbox";
17
- import { SgdsButton } from "../src/Button";
18
- import { sendKeys } from "@web/test-runner-commands";
19
- import { CardElement } from "../src/utils/card-element";
20
- import { Button } from "bootstrap";
21
-
22
- describe("<sgds-action-card>", () => {
23
- // Card test cases
24
- it("is defined", () => {
25
- const el = document.createElement("sgds-action-card");
26
- assert.instanceOf(el, SgdsActionCard);
27
- });
28
-
29
- it("should have sgds prefix on wrapper", async () => {
30
- const el = await fixture(html`<sgds-action-card></sgds-action-card>`);
31
- const slCard = el.shadowRoot?.querySelector("div");
32
- expect(slCard?.classList.value).to.contain("sgds");
33
- });
34
-
35
- it("accepts a bg prop", async () => {
36
- const el = await fixture(html`<sgds-action-card></sgds-action-card>`);
37
- el?.setAttribute("bgColor", "primary");
38
- await elementUpdated(el);
39
- const bgColor = el.shadowRoot?.querySelector("div");
40
- expect(bgColor?.classList.value).to.contain("bg-primary");
41
- });
42
-
43
- it("accepts a text prop", async () => {
44
- const el = await fixture(html`<sgds-action-card></sgds-action-card>`);
45
- el?.setAttribute("borderColor", "primary");
46
- await elementUpdated(el);
47
- const borderColor = el.shadowRoot?.querySelector("div");
48
- expect(borderColor?.classList.value).to.contain("border-primary");
49
- });
50
-
51
- it("accepts a border prop", async () => {
52
- const el = await fixture(html`<sgds-action-card></sgds-action-card>`);
53
- el?.setAttribute("textColor", "primary");
54
- await elementUpdated(el);
55
- const bgColor = el.shadowRoot?.querySelector("div");
56
- expect(bgColor?.classList.value).to.contain("text-primary");
57
- });
58
-
59
- it("can be semantically compare with shadowDom trees", async () => {
60
- const el = await fixture(
61
- html`<sgds-action-card inputId="checkbox"></sgds-action-card>`
62
- );
63
- assert.shadowDom.equal(
64
- el,
65
- `
66
- <div tabindex="0" variant="card-action" class="sgds card
67
-
68
- ">
69
- <div class="card-body">
70
- <h6 class="text-muted card-subtitle">
71
- <div>
72
-
73
- <slot name="card-subtitle"></slot>
74
- </div>
75
- <div class="card-input">
76
- <sgds-checkbox checkboxid="checkbox" arialabel="checkbox"></sgds-checkbox>
77
- </div>
78
- </h6>
79
- <h5 class="card-title"><slot name="card-title"></slot></h5>
80
- <p class="card-text"><slot name="card-text"></slot></p>
81
- </div>
82
- </div>
83
- `
84
- );
85
- });
86
-
87
- it("it should have type checkbox and variant card-action by default", async () => {
88
- const el = await fixture(html`<sgds-action-card></sgds-action-card>`);
89
- expect(el?.getAttribute("type")).to.equal("checkbox");
90
- expect(el?.getAttribute("variant")).to.equal("card-action");
91
- });
92
-
93
- it("it should have type radio when specified", async () => {
94
- const el = await fixture(
95
- html`<sgds-action-card type="radio"></sgds-action-card>`
96
- );
97
- expect(el?.getAttribute("type")).to.equal("radio");
98
- });
99
-
100
- it("when card is clicked, card should contain class is-active", async () => {
101
- const el = await fixture<SgdsActionCard>(
102
- html`<sgds-action-card></sgds-action-card>`
103
- );
104
-
105
- expect(el.shadowRoot?.querySelector("div.sgds.card")).to.not.have.class(
106
- "is-active"
107
- );
108
- const cardBody = el.shadowRoot?.querySelector(
109
- "div.card-body"
110
- ) as HTMLInputElement;
111
- cardBody.click();
112
- await el.updateComplete;
113
- expect(el.shadowRoot?.querySelector("div.sgds.card")).to.have.class(
114
- "is-active"
115
- );
116
- });
117
-
118
- it("when card is disabled, card should be clickable and does not contain class is-active", async () => {
119
- const el = await fixture<SgdsActionCard>(
120
- html`<sgds-action-card disabled></sgds-action-card>`
121
- );
122
-
123
- expect(el.shadowRoot?.querySelector("div.sgds.card")).to.not.have.class(
124
- "is-active"
125
- );
126
- const cardBody = el.shadowRoot?.querySelector(
127
- "div.card-body"
128
- ) as HTMLInputElement;
129
- cardBody.click();
130
- await el.updateComplete;
131
- expect(el.shadowRoot?.querySelector("div.sgds.card")).to.not.have.class(
132
- "is-active"
133
- );
134
- });
135
-
136
- it("when card is focus, card should be able to be checked with key Enter and contains class is-active", async () => {
137
- const el = await fixture<SgdsActionCard>(
138
- html`<sgds-action-card></sgds-action-card>`
139
- );
140
-
141
- expect(el.shadowRoot?.querySelector("div.sgds.card")).to.not.have.class(
142
- "is-active"
143
- );
144
- // const cardBody = el.shadowRoot?.querySelector(
145
- // "div.card-body"
146
- // ) as HTMLInputElement;
147
- const card = el.shadowRoot?.querySelector(
148
- "div.sgds.card"
149
- ) as HTMLInputElement;
150
- card.focus();
151
- await sendKeys({ press: "Enter" });
152
- await el.updateComplete;
153
- expect(el.shadowRoot?.querySelector("div.sgds.card")).to.have.class(
154
- "is-active"
155
- );
156
- });
157
- });
158
-
159
-