@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,221 +0,0 @@
1
- import { html, css } from "lit";
2
- import { customElement, property, state, query } from "lit/decorators.js";
3
- import { classMap } from "lit/directives/class-map.js";
4
- import { watch } from "../utils/watch";
5
- import styles from "./sgds-radiogroup.scss";
6
- import SgdsElement from "../utils/sgds-element";
7
- import SgdsRadio from "./sgds-radio";
8
- import { FormSubmitController } from "../utils/form";
9
-
10
- @customElement("sgds-radiogroup")
11
- export class SgdsRadioGroup extends SgdsElement {
12
- static styles = styles;
13
-
14
- protected readonly formSubmitController = new FormSubmitController(this, {
15
- defaultValue: (control: SgdsRadioGroup) => control.defaultValue,
16
- });
17
-
18
- @query("slot:not([name])") defaultSlot: HTMLSlotElement;
19
- @query(".radio-group__validation-input") input: HTMLInputElement;
20
-
21
- @state() private defaultValue = "";
22
- @state() private customErrorMessage = "";
23
-
24
- /**
25
- * The radio group label. Required for proper accessibility. If you need to display HTML, you can use the `label` slot
26
- * instead.
27
- */
28
- @property() label = "";
29
-
30
- /** The selected value of the control. */
31
- @property({ reflect: true }) value = "";
32
-
33
- /** The name assigned to the radio controls. */
34
- @property({ reflect: true }) name = "option";
35
-
36
- /** Ensures a child radio is checked before allowing the containing form to submit. */
37
- @property({ type: Boolean, reflect: true }) required = false;
38
-
39
- /**
40
- * This will be true when the control is in an invalid state.
41
- */
42
- @property({ type: Boolean, reflect: true }) invalid = false;
43
-
44
- @property({ type: String, reflect: true }) invalidFeedback =
45
- "default feedback";
46
-
47
- @watch("value")
48
- handleValueChange() {
49
- if (this.hasUpdated) {
50
- this.emit("sgds-change");
51
- this.updateCheckedRadio();
52
- }
53
- }
54
-
55
- connectedCallback() {
56
- super.connectedCallback();
57
- this.defaultValue = this.value;
58
- }
59
-
60
- get validity(): ValidityState {
61
- const hasMissingData = !((this.value && this.required) || !this.required);
62
- const hasCustomError = this.customErrorMessage !== "";
63
- return {
64
- badInput: false,
65
- customError: hasCustomError,
66
- patternMismatch: false,
67
- rangeOverflow: false,
68
- rangeUnderflow: false,
69
- stepMismatch: false,
70
- tooLong: false,
71
- tooShort: false,
72
- typeMismatch: false,
73
- valid: hasMissingData ? false : true,
74
- valueMissing: !hasMissingData,
75
- };
76
- }
77
-
78
- /** Checks for validity and shows the browser's validation message if the control is invalid. */
79
- reportValidity(): boolean {
80
- const validity = this.validity;
81
-
82
- // this.errorMessage = this.customErrorMessage || validity.valid ? '' : this.input.validationMessage;
83
- // this.invalid = !this.input.checkValidity();
84
- this.invalid = !validity.valid;
85
-
86
- if (!validity.valid) {
87
- this.showNativeErrorMessage();
88
- }
89
-
90
- return !this.invalid;
91
- }
92
-
93
- private getAllRadios() {
94
- return [...this.querySelectorAll<SgdsRadio>("sgds-radio")];
95
- }
96
-
97
- handleRadioClick(event: MouseEvent) {
98
- const target = event.target as SgdsRadio;
99
-
100
- if (target.disabled) {
101
- return;
102
- }
103
-
104
- this.value = target.value;
105
- const radios = this.getAllRadios();
106
- radios.forEach((radio) => (radio.checked = radio === target));
107
- }
108
-
109
- handleKeyDown(event: KeyboardEvent) {
110
- if (
111
- !["ArrowUp", "ArrowDown", "ArrowLeft", "ArrowRight", " "].includes(
112
- event.key
113
- )
114
- ) {
115
- return;
116
- }
117
-
118
- const radios = this.getAllRadios().filter((radio) => !radio.disabled);
119
- const checkedRadio = radios.find((radio) => radio.checked) ?? radios[0];
120
- //if eventkey is space, index increment is 0, if eventkey arrowup/arrowleft, index is -1, arrowright/arrowdown, index incr is 1
121
- const incr =
122
- event.key === " "
123
- ? 0
124
- : ["ArrowUp", "ArrowLeft"].includes(event.key)
125
- ? -1
126
- : 1;
127
- let index = radios.indexOf(checkedRadio) + incr;
128
- if (index < 0) {
129
- index = radios.length - 1;
130
- }
131
- if (index > radios.length - 1) {
132
- index = 0;
133
- }
134
-
135
- this.getAllRadios().forEach((radio) => {
136
- radio.checked = false;
137
- radio.tabIndex = -1;
138
- });
139
-
140
- this.value = radios[index].value;
141
- radios[index].checked = true;
142
- radios[index].tabIndex = 0;
143
- radios[index].focus();
144
-
145
- event.preventDefault();
146
- }
147
-
148
- handleLabelClick() {
149
- const radios = this.getAllRadios();
150
- const checked = radios.find((radio) => radio.checked);
151
- const radioToFocus = checked || radios[0];
152
-
153
- // Move focus to the checked radio (or the first one if none are checked) when clicking the label
154
- if (radioToFocus) {
155
- radioToFocus.focus();
156
- }
157
- }
158
-
159
- handleSlotChange() {
160
- const radios = this.getAllRadios();
161
-
162
- radios.forEach((radio) => (radio.checked = radio.value === this.value));
163
-
164
- if (!radios.some((radio) => radio.checked)) {
165
- if (radios[0]) radios[0]!.tabIndex = 0;
166
- }
167
- }
168
-
169
- handleInvalid() {
170
- this.invalid = true;
171
- }
172
-
173
- showNativeErrorMessage() {
174
- this.input.hidden = false;
175
- this.input.reportValidity();
176
- setTimeout(() => (this.input.hidden = true), 10000);
177
- }
178
-
179
- updateCheckedRadio() {
180
- const radios = this.getAllRadios();
181
- radios.forEach((radio) => (radio.checked = radio.value === this.value));
182
- this.invalid = !this.validity.valid;
183
- }
184
-
185
- render() {
186
- const defaultSlot = html`
187
- <div>
188
- <slot
189
- @click=${this.handleRadioClick}
190
- @keydown=${this.handleKeyDown}
191
- @slotchange=${this.handleSlotChange}
192
- role="presentation"
193
- ></slot>
194
- </div>
195
- `;
196
- return html`
197
- <fieldset role="radiogroup" part="base" name=${this.name}>
198
- <label @click=${this.handleLabelClick} class="form-label" part="label">
199
- <slot name="label">${this.label}</slot>
200
- </label>
201
- ${defaultSlot}
202
- <input
203
- part="control"
204
- type="text"
205
- class="radio-group__validation-input visually-hidden ${classMap({
206
- "is-invalid": this.invalid,
207
- })}"
208
- ?required=${this.required}
209
- tabindex="-1"
210
- @invalid=${this.handleInvalid}
211
- hidden
212
- />
213
- <div class="invalid-feedback" part="invalidFeedback">
214
- ${this.invalidFeedback}
215
- </div>
216
- </fieldset>
217
- `;
218
- }
219
- }
220
-
221
- export default SgdsRadioGroup;
@@ -1,4 +0,0 @@
1
-
2
- export { SgdsSidenav } from "./sgds-sidenav";
3
- export { SgdsSidenavItem } from "./sgds-sidenav-item";
4
- export { SgdsSidenavLink } from "./sgds-sidenav-link";
@@ -1,73 +0,0 @@
1
- @import "../utils/base.scss";
2
- @import "~@govtechsg/sgds/sass/transitions";
3
- @import "~bootstrap-icons/font/fonts/bootstrap-icons.css";
4
-
5
- :host {
6
- --sidenav-theme-color: #5925DC;
7
- }
8
-
9
- .sidenav-btn {
10
- width: 100%;
11
- text-align: initial;
12
- line-height: 1.5rem;
13
- font-size: 1rem;
14
- border: 0;
15
- background: 0;
16
- padding: 0.5rem 1rem;
17
- border-left: $navbar-border-bottom-height solid transparent;
18
- border-radius: 0;
19
- display: flex;
20
- align-items: center;
21
-
22
- &.active,
23
- &:hover {
24
- color: var(--sidenav-theme-color);
25
- border-left-color: var(--sidenav-theme-color);
26
- font-weight: $font-weight-bold;
27
- }
28
- &.disabled{
29
- opacity: 0.65;
30
- pointer-events: none;
31
- }
32
- svg {
33
- &.bi-chevron-down {
34
- @extend .ms-auto;
35
- transition: all 0.3s ease-in-out;
36
- transform: rotate(180deg);
37
- }
38
- }
39
- &:not(.active) {
40
- svg {
41
- &.bi-chevron-down {
42
- transform: rotate(0deg);
43
- }
44
- }
45
- }
46
- }
47
-
48
- a.sidenav-btn {
49
- color: inherit;
50
- text-decoration: none;
51
- line-height: 1.5rem;
52
- }
53
-
54
- .sidenav-list {
55
- list-style: none;
56
- display: flex;
57
- flex-direction: column;
58
- padding-left: 0;
59
- margin: 0;
60
- line-height: 2rem;
61
- }
62
-
63
- .collapse,
64
- .collapse.show,
65
- .collapsing {
66
- margin-top: $sidenav-item-spacing;
67
- }
68
-
69
- ::slotted(*[slot="title"]) {
70
- display: flex;
71
- gap: 1rem;
72
- align-items: center;
73
- }
@@ -1,145 +0,0 @@
1
- import { html } from "lit";
2
- import { customElement, property } from "lit/decorators.js";
3
- import SgdsElement from "../utils/sgds-element";
4
- import styles from "./sgds-sidenav-item.scss";
5
- import { ref, createRef, Ref } from "lit/directives/ref.js";
6
- import { Collapse } from "bootstrap";
7
- import genId from "../utils/generateId";
8
- import { classMap } from "lit/directives/class-map.js";
9
-
10
- @customElement("sgds-sidenav-item")
11
- export class SgdsSidenavItem extends SgdsElement {
12
- static styles = styles;
13
-
14
- private myCollapse: Ref<HTMLElement> = createRef();
15
- private bsCollapse: Collapse = null;
16
-
17
- /** when true, toggles the sidenav-item to open on first load and
18
- * set the active stylings.
19
- */
20
- @property({ type: Boolean })
21
- active = false;
22
-
23
- @property({ type: String })
24
- href = "";
25
-
26
- @property({ type: String })
27
- collapseId = genId("sidenav", "collapse");
28
-
29
- @property({ type: String })
30
- buttonId = genId("sidenav", "button");
31
-
32
- @property({ type: Boolean, reflect: true })
33
- disabled = false;
34
-
35
- private index = "-1";
36
-
37
- private _onClick() {
38
- this.emit("sgds-toggle", { detail: { index: this.index } });
39
- }
40
-
41
- private _onClickButton() {
42
- this._onClick();
43
- if (this.bsCollapse) {
44
- this.bsCollapse.toggle();
45
- }
46
- }
47
- private _onClickLink() {
48
- this._onClick();
49
- this.active = true;
50
- }
51
-
52
- /**
53
- * closeItem - closes sidenav and inactivates it
54
- */
55
- public closeItem() {
56
- this.active = false;
57
- if (this.bsCollapse) this.bsCollapse.hide();
58
- }
59
- /**
60
- * openItem
61
- */
62
- public openItem() {
63
- this.active = true;
64
- if (this.bsCollapse) this.bsCollapse.show();
65
- }
66
-
67
- firstUpdated() {
68
- // if sidenav has menu, initialise bootstrap collapse
69
- if (!this.href) {
70
- this.bsCollapse = new Collapse(this.myCollapse.value, {
71
- toggle: this.active,
72
- });
73
-
74
- this.myCollapse.value.addEventListener("show.bs.collapse", () => {
75
- this.active = true;
76
- });
77
- this.myCollapse.value.addEventListener("shown.bs.collapse", () => {
78
- this.active = true;
79
- });
80
- this.myCollapse.value.addEventListener("hide.bs.collapse", () => {
81
- this.active = false;
82
- });
83
- this.myCollapse.value.addEventListener("hidden.bs.collapse", () => {
84
- this.active = false;
85
- });
86
- }
87
- }
88
-
89
- render() {
90
- const withMenuTemplate = html` <button
91
- @click=${() => this._onClickButton()}
92
- class="collapsed sidenav-btn ${classMap({
93
- disabled: this.disabled,
94
- active: this.active,
95
- })} "
96
- aria-expanded="${this.active}"
97
- aria-controls="${this.collapseId}"
98
- aria-selected="${this.active}"
99
- id="${this.buttonId}"
100
- ?disabled=${this.disabled}
101
- aria-disabled=${this.disabled ? "true" : "false"}
102
- >
103
- <slot name="title"></slot>
104
- <svg
105
- xmlns="http://www.w3.org/2000/svg"
106
- width="16"
107
- height="16"
108
- fill="currentColor"
109
- class="bi bi-chevron-down"
110
- viewBox="0 0 16 16"
111
- >
112
- <path
113
- fill-rule="evenodd"
114
- d="M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z"
115
- />
116
- </svg>
117
- </button>
118
- <div class="collapse" ${ref(this.myCollapse)} id="${this.collapseId}">
119
- <ul class="sidenav-list" aria-labelledby="${this.buttonId}">
120
- <slot></slot>
121
- </ul>
122
- </div>`;
123
-
124
- const noMenuTemplate = html`
125
- <a
126
- href=${this.href}
127
- @click=${() => this._onClickLink()}
128
- class="sidenav-btn ${classMap({
129
- disabled: this.disabled,
130
- active: this.active,
131
- })} "
132
- aria-selected="${this.active}"
133
- ?disabled=${this.disabled}
134
- aria-disabled=${this.disabled ? "true" : "false"}
135
- >
136
- <slot name="title"></slot>
137
- </a>
138
- `;
139
- return html`
140
- <li class="sidenav-item" aria-haspopup="${!this.href}">
141
- ${this.href ? noMenuTemplate : withMenuTemplate}
142
- </li>
143
- `;
144
- }
145
- }
@@ -1,25 +0,0 @@
1
- @import "../utils/base.scss";
2
-
3
- a.nav-link {
4
- display: block;
5
- color: inherit;
6
- font-size: $sidenav-fontsize;
7
- padding-top: 0.5rem;
8
- padding-bottom: 0.5rem;
9
- padding-left: calc(
10
- #{$sidenav-item-spacing * 4} + #{$sidenav-btn-border-width}
11
- );
12
- padding-right: 0;
13
- text-decoration: none;
14
-
15
- &.active,
16
- &:hover {
17
- color: var(--sidenav-theme-color);
18
- }
19
- // Disabled state lightens text
20
- &.disabled {
21
- color: $nav-link-disabled-color;
22
- pointer-events: none;
23
- cursor: default;
24
- }
25
- }
@@ -1,8 +0,0 @@
1
- import LinkElement from "../utils/link-element";
2
- import { customElement } from "lit/decorators.js";
3
- import styles from "./sgds-sidenav-link.scss";
4
-
5
- @customElement("sgds-sidenav-link")
6
- export class SgdsSidenavLink extends LinkElement {
7
- static styles = styles;
8
- }
@@ -1,6 +0,0 @@
1
- ul {
2
- display: flex;
3
- flex-direction: column;
4
- gap: 1rem;
5
- list-style: none;
6
- }
@@ -1,33 +0,0 @@
1
- import { html } from "lit";
2
- import SgdsElement from "../utils/sgds-element";
3
- import { customElement, property } from "lit/decorators.js";
4
- import styles from "./sgds-sidenav.scss";
5
-
6
- @customElement("sgds-sidenav")
7
- export class SgdsSidenav extends SgdsElement {
8
- static styles = styles;
9
-
10
- @property({ type: Boolean, attribute: true })
11
- alwaysOpen = false;
12
-
13
- render() {
14
- this.alwaysOpen
15
- ? null
16
- : this.addEventListener("sgds-toggle", (e: CustomEvent) => {
17
- const children = this.shadowRoot.querySelector('slot').assignedElements({flatten: true});
18
- for (let i = 0; i < children.length; i++) {
19
- if (e.detail.index != i) {
20
- (children[i] as any).closeItem();
21
- }
22
- }
23
- });
24
-
25
- return html`
26
- <nav class="sidenav" id="${this.id}">
27
- <ul>
28
- <slot></slot>
29
- </ul>
30
- </nav>
31
- `;
32
- }
33
- }
package/src/Tab/index.ts DELETED
@@ -1,3 +0,0 @@
1
- export { SgdsTab } from './sgds-tab';
2
- export { SgdsTabPanel } from './sgds-tabpanel';
3
- export { SgdsTabGroup } from './sgds-tabgroup';
@@ -1,84 +0,0 @@
1
- @import '../utils/components.style';
2
- @import '../utils/base.scss';
3
-
4
- :host {
5
- display: inline-block;
6
-
7
- sgds-tab {
8
- + sgds-tab{
9
- margin-right: 1rem;
10
- }
11
- }
12
- }
13
-
14
- .tab {
15
- display: inline-flex;
16
- align-items: center;
17
- font-family: $font-family-sans-serif;
18
- font-size: $font-size-base;
19
- color: $gray-600;
20
- padding: $nav-sgds-tabs-padding-y 0;
21
- white-space: nowrap;
22
- user-select: none;
23
- cursor: pointer;
24
- transition: var(--transition-speed) box-shadow, var(--transition-speed) color;
25
- }
26
-
27
- .tab:focus {
28
- outline: none;
29
- }
30
-
31
- .tab:focus-visible:not(.tab--disabled) {
32
- color: $blue-500;
33
- }
34
-
35
- .tab:focus-visible {
36
- outline: $blue-500 solid $input-btn-focus-width;
37
- outline-offset: calc(-1 * #{$input-btn-focus-width} - 1px);
38
- }
39
-
40
- .tab.tab--active:not(.tab--disabled) {
41
- color: $body-color;
42
- font-weight: $font-weight-bold;
43
- border-bottom: solid $nav-tabs-border-width $blue-500;
44
- }
45
-
46
-
47
-
48
- .tab.tab--disabled {
49
- opacity: 0.5;
50
- cursor: not-allowed;
51
- }
52
-
53
-
54
- @media (forced-colors: active) {
55
- .tab.tab--active:not(.tab--disabled) {
56
- outline: solid 1px transparent;
57
- outline-offset: -3px;
58
- }
59
- }
60
-
61
- .tab {
62
- ::slotted(i){
63
- margin-top:-4px;
64
- margin-right: 0.5rem;
65
- }
66
- ::slotted(.badge){
67
- margin-left: 0.5rem;
68
- }
69
- &--basic-toggle{
70
- background-color: $white;
71
- border: 1px solid $gray-400;
72
- border-radius: 0;
73
- color: #1d2939;
74
- padding: 0.75rem 1.5rem;
75
- + .tab--basic-toggle{
76
- margin-left: -2px;
77
- }
78
- &.tab--active:not(.tab--disabled){
79
- background: var(--indicator-color);
80
- color: white;
81
- border-bottom: 1px solid $gray-400;
82
- }
83
- }
84
- }
@@ -1,87 +0,0 @@
1
- import { html } from "lit";
2
- import { customElement, property, query, state } from "lit/decorators.js";
3
- import { classMap } from "lit/directives/class-map.js";
4
- import SgdsElement from "../utils/sgds-element";
5
- import { watch } from "../utils/watch";
6
- import styles from "./sgds-tab.scss";
7
-
8
- let id = 0;
9
-
10
- @customElement("sgds-tab")
11
- export class SgdsTab extends SgdsElement {
12
- static styles = styles;
13
- @query(".tab") tab: HTMLElement;
14
-
15
- private readonly attrId = ++id;
16
- private readonly componentId = `sgds-tab-${this.attrId}`;
17
-
18
- @property({ reflect: true }) label = "";
19
- /** The name of the tab panel this tab is associated with. The panel must be located in the same tab group. */
20
- @property({ reflect: true }) panel = "";
21
-
22
-
23
-
24
-
25
- /** Draws the tab in an active state. */
26
- @property({ type: Boolean, reflect: true }) active = false;
27
-
28
- /** Makes the tab closable and shows a close button. */
29
- @property({ type: Boolean }) closable = false;
30
-
31
- /** Disables the tab and prevents selection. */
32
- @property({ type: Boolean, reflect: true }) disabled = false;
33
-
34
- @property({ type: Boolean, reflect: true }) variant;
35
-
36
- connectedCallback() {
37
- super.connectedCallback();
38
- this.setAttribute("role", "tab");
39
- }
40
-
41
- /** Sets focus to the tab. */
42
- focus(options?: FocusOptions) {
43
- this.tab.focus(options);
44
- }
45
-
46
- /** Removes focus from the tab. */
47
- blur() {
48
- this.tab.blur();
49
- }
50
-
51
- handleCloseClick() {
52
- this.emit("sgds-close");
53
- }
54
-
55
- @watch("active")
56
- handleActiveChange() {
57
- this.setAttribute("aria-selected", this.active ? "true" : "false");
58
- }
59
-
60
- @watch("disabled")
61
- handleDisabledChange() {
62
- this.setAttribute("aria-disabled", this.disabled ? "true" : "false");
63
- }
64
-
65
- render() {
66
- // If the user didn't provide an ID, we'll set one so we can link tabs and tab panels with aria labels
67
- this.id = this.id.length > 0 ? this.id : this.componentId;
68
-
69
- const getAttr = this.closest('sgds-tab').getAttribute('variant')
70
-
71
- return html`
72
- <div
73
- part="base"
74
- class=${classMap({
75
- tab: true,
76
- "tab--active": this.active,
77
- "tab--closable": this.closable,
78
- "tab--disabled": this.disabled,
79
- [`tab--${getAttr}`]: getAttr
80
- })}
81
- tabindex=${this.disabled ? "-1" : "0"}
82
- >
83
- <slot></slot>
84
- </div>
85
- `;
86
- }
87
- }