@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,309 +0,0 @@
1
- import { html } from 'lit';
2
- import { customElement, property, query } from 'lit/decorators.js';
3
- import { classMap } from 'lit/directives/class-map.js';
4
- import { ifDefined } from 'lit/directives/if-defined.js';
5
- import { animateTo, stopAnimations } from '../utils/animate';
6
- import { waitForEvent } from '../utils/event';
7
- import Modal from '../utils/modal';
8
- import { lockBodyScrolling, unlockBodyScrolling } from '../utils/scroll';
9
- import SgdsElement from "../utils/sgds-element";
10
- import { HasSlotController } from '../utils/slot';
11
- import { watch } from '../utils/watch';
12
- import { getAnimation, setDefaultAnimation } from '../utils/animation-registry';
13
- import styles from "./sgds-modal.scss";
14
-
15
-
16
- @customElement('sgds-modal')
17
- export class SgdsModal extends SgdsElement {
18
-
19
- static styles = styles;
20
-
21
- @query('.modal') dialog: HTMLElement;
22
- @query('.modal-panel') panel: HTMLElement;
23
- @query('.modal-overlay') overlay: HTMLElement;
24
-
25
- private readonly hasSlotController = new HasSlotController(this, 'footer');
26
- private modal: Modal;
27
- private originalTrigger: HTMLElement | null;
28
-
29
- @property({ type: Boolean, reflect: true }) open = false;
30
- // @property({ type: Boolean, reflect: true }) centeredAlignVariant = false;
31
-
32
- @property({ reflect: true }) title = '';
33
- @property({ reflect: true }) titleIcon = '';
34
- @property({ attribute: 'no-header', type: Boolean, reflect: true }) noHeader = false;
35
-
36
- connectedCallback() {
37
- super.connectedCallback();
38
- this.handleDocumentKeyDown = this.handleDocumentKeyDown.bind(this);
39
- this.modal = new Modal(this);
40
- }
41
-
42
- firstUpdated() {
43
- this.dialog.hidden = !this.open;
44
-
45
- if (this.open) {
46
- this.addOpenListeners();
47
- this.modal.activate();
48
- lockBodyScrolling(this);
49
- }
50
- }
51
-
52
- disconnectedCallback() {
53
- super.disconnectedCallback();
54
- unlockBodyScrolling(this);
55
- }
56
-
57
- /** Shows the dialog. */
58
- async show() {
59
- if (this.open) {
60
- return undefined;
61
- }
62
-
63
- this.open = true;
64
- return waitForEvent(this, 'sgds-after-show');
65
- }
66
-
67
- /** Hides the dialog */
68
- async hide() {
69
- if (!this.open) {
70
- return undefined;
71
- }
72
-
73
- this.open = false;
74
- return waitForEvent(this, 'sgds-after-hide');
75
- }
76
-
77
- private requestClose(source: 'close-button' | 'keyboard' | 'overlay') {
78
- const slRequestClose = this.emit('sgds-request-close', {
79
- cancelable: true,
80
- detail: { source }
81
- });
82
-
83
- if (slRequestClose.defaultPrevented) {
84
- const animation = getAnimation(this, 'modal.denyClose');
85
- animateTo(this.panel, animation.keyframes);
86
- return;
87
- }
88
-
89
- this.hide();
90
- }
91
-
92
- addOpenListeners() {
93
- document.addEventListener('keydown', this.handleDocumentKeyDown);
94
- }
95
-
96
- removeOpenListeners() {
97
- document.removeEventListener('keydown', this.handleDocumentKeyDown);
98
- }
99
-
100
- handleDocumentKeyDown(event: KeyboardEvent) {
101
- if (this.open && event.key === 'Escape') {
102
- event.stopPropagation();
103
- this.requestClose('keyboard');
104
- }
105
- }
106
-
107
- @watch('open', { waitUntilFirstUpdate: true })
108
- async handleOpenChange() {
109
- if (this.open) {
110
- // Show
111
- this.emit('sgds-show');
112
- this.addOpenListeners();
113
- this.originalTrigger = document.activeElement as HTMLElement;
114
- this.modal.activate();
115
-
116
- lockBodyScrolling(this);
117
-
118
- // When the dialog is shown, Safari will attempt to set focus on whatever element has autofocus. This can cause
119
- // the dialogs's animation to jitter (if it starts offscreen), so we'll temporarily remove the attribute, call
120
- // `focus({ preventScroll: true })` ourselves, and add the attribute back afterwards.
121
- //
122
- // Related: https://github.com/shoelace-style/shoelace/issues/693
123
- //
124
- const autoFocusTarget = this.querySelector('[autofocus]');
125
- if (autoFocusTarget) {
126
- autoFocusTarget.removeAttribute('autofocus');
127
- }
128
-
129
- await Promise.all([stopAnimations(this.dialog), stopAnimations(this.overlay)]);
130
- this.dialog.hidden = false;
131
-
132
- // Set initial focus
133
- requestAnimationFrame(() => {
134
- const slInitialFocus = this.emit('sgds-initial-focus', { cancelable: true });
135
-
136
- if (!slInitialFocus.defaultPrevented) {
137
- // Set focus to the autofocus target and restore the attribute
138
- if (autoFocusTarget) {
139
- (autoFocusTarget as HTMLInputElement).focus({ preventScroll: true });
140
- } else {
141
- this.panel.focus({ preventScroll: true });
142
- }
143
- }
144
-
145
- // Restore the autofocus attribute
146
- if (autoFocusTarget) {
147
- autoFocusTarget.setAttribute('autofocus', '');
148
- }
149
- });
150
-
151
- const panelAnimation = getAnimation(this, 'modal.show');
152
- const overlayAnimation = getAnimation(this, 'modal.overlay.show');
153
- await Promise.all([
154
- animateTo(this.panel, panelAnimation.keyframes, panelAnimation.options),
155
- animateTo(this.overlay, overlayAnimation.keyframes, overlayAnimation.options)
156
- ]);
157
-
158
- this.emit('sgds-after-show');
159
- } else {
160
- // Hide
161
- this.emit('sgds-hide');
162
- this.removeOpenListeners();
163
- this.modal.deactivate();
164
-
165
- await Promise.all([stopAnimations(this.dialog), stopAnimations(this.overlay)]);
166
- const panelAnimation = getAnimation(this, 'modal.hide');
167
- const overlayAnimation = getAnimation(this, 'modal.overlay.hide');
168
-
169
- // Animate the overlay and the panel at the same time. Because animation durations might be different, we need to
170
- // hide each one individually when the animation finishes, otherwise the first one that finishes will reappear
171
- // unexpectedly. We'll unhide them after all animations have completed.
172
- await Promise.all([
173
- animateTo(this.overlay, overlayAnimation.keyframes, overlayAnimation.options).then(() => {
174
- this.overlay.hidden = true;
175
- }),
176
- animateTo(this.panel, panelAnimation.keyframes, panelAnimation.options).then(() => {
177
- this.panel.hidden = true;
178
- })
179
- ]);
180
-
181
- this.dialog.hidden = true;
182
-
183
- // Now that the dialog is hidden, restore the overlay and panel for next time
184
- this.overlay.hidden = false;
185
- this.panel.hidden = false;
186
-
187
- unlockBodyScrolling(this);
188
-
189
- // Restore focus to the original trigger
190
- const trigger = this.originalTrigger;
191
- if (typeof trigger?.focus === 'function') {
192
- setTimeout(() => trigger.focus());
193
- }
194
-
195
- this.emit('sgds-after-hide');
196
- }
197
- }
198
-
199
- render() {
200
- // if label is defined
201
- const withLabelIcon = html`
202
- <sl-icon name=${this.titleIcon} class="pe-2 flex-shrink-0"></sl-icon>`
203
-
204
- return html`
205
- <div
206
- part="base"
207
- class=${classMap({
208
- modal: true,
209
- 'modal--open': this.open,
210
- 'modal--has-footer': this.hasSlotController.test('footer')
211
- })}
212
- >
213
- <div part="overlay" class="modal-overlay" @click=${() => this.requestClose('overlay')} tabindex="-1"></div>
214
-
215
- <div
216
- part="panel"
217
- class="modal-panel"
218
- role="dialog"
219
- aria-modal="true"
220
- aria-hidden=${this.open ? 'false' : 'true'}
221
- aria-label=${ifDefined(this.noHeader ? this.title : undefined)}
222
- aria-labelledby=${ifDefined(!this.noHeader ? 'title' : undefined)}
223
- tabindex="0"
224
- >
225
- ${!this.noHeader
226
- ? html`
227
- <h3 part="header"
228
- class=${classMap({
229
- 'modal-header' : true,
230
- // centered: this.centeredAlignVariant,
231
- })}
232
- >
233
- <div
234
- part="title"
235
- class=${classMap({
236
- 'modal-title d-flex align-items-center': true,
237
- // centered : this.centeredAlignVariant,
238
- })}
239
- id="title"
240
- >
241
- ${this.titleIcon ? withLabelIcon : null}
242
- ${this.title.length > 0 ? this.title : String.fromCharCode(65279)}
243
-
244
- </div>
245
- <sgds-button
246
- part="close-button"
247
- variant="icon"
248
- exportparts="base:close-button__base"
249
- class=${classMap({
250
- 'modal-close': true,
251
- // 'centered': this.centeredAlignVariant,
252
- })}
253
- @click="${() => this.requestClose('close-button')}"
254
- ><sl-icon name="x-lg"></sl-icon></sgds-button>
255
- </h3>
256
- `
257
- : ''}
258
-
259
- <div part="body" class="modal-body">
260
- <slot></slot>
261
- </div>
262
-
263
- <footer
264
- part="footer"
265
- class=${classMap({
266
- 'modal-footer': true,
267
- // centered: this.centeredAlignVariant,
268
- })}
269
- >
270
- <slot name="footer"></slot>
271
- </footer>
272
- </div>
273
- </div>
274
- `;
275
- }
276
- }
277
-
278
- setDefaultAnimation('modal.show', {
279
- keyframes: [
280
- { opacity: 0, transform: 'scale(0.8)' },
281
- { opacity: 1, transform: 'scale(1)' }
282
- ],
283
- options: { duration: 250, easing: 'ease' }
284
- });
285
-
286
- setDefaultAnimation('modal.hide', {
287
- keyframes: [
288
- { opacity: 1, transform: 'scale(1)' },
289
- { opacity: 0, transform: 'scale(0.8)' }
290
- ],
291
- options: { duration: 250, easing: 'ease' }
292
- });
293
-
294
- setDefaultAnimation('modal.denyClose', {
295
- keyframes: [{ transform: 'scale(1)' }, { transform: 'scale(1.02)' }, { transform: 'scale(1)' }],
296
- options: { duration: 250 }
297
- });
298
-
299
- setDefaultAnimation('modal.overlay.show', {
300
- keyframes: [{ opacity: 0 }, { opacity: 1 }],
301
- options: { duration: 250 }
302
- });
303
-
304
- setDefaultAnimation('modal.overlay.hide', {
305
- keyframes: [{ opacity: 1 }, { opacity: 0 }],
306
- options: { duration: 250 }
307
- });
308
-
309
- export default SgdsModal;
@@ -1 +0,0 @@
1
- export { SgdsQuantityToggle } from "./sgds-quantitytoggle";
@@ -1,10 +0,0 @@
1
-
2
- @import '../utils/base.scss';
3
- @import "~@govtechsg/sgds/sass/forms/labels";
4
- @import "~@govtechsg/sgds/sass/forms/form-text";
5
- @import "~@govtechsg/sgds/sass/forms/form-control";
6
- @import "~@govtechsg/sgds/sass/forms/form-control-group";
7
- @import "~@govtechsg/sgds/sass/forms/input-group";
8
- @import "~@govtechsg/sgds/sass/forms/validation";
9
- @import "~@govtechsg/sgds/sass/buttons";
10
-
@@ -1,130 +0,0 @@
1
- import { customElement, property,query, state } from "lit/decorators.js";
2
- import { html } from 'lit/static-html.js';
3
- import { ifDefined } from 'lit/directives/if-defined.js';
4
- import SgdsElement from "../utils/sgds-element";
5
- import { defaultValue } from "../utils/defaultvalue";
6
- import genId from "../utils/generateId";
7
- import { live } from 'lit/directives/live.js';
8
- import { watch } from "../utils/watch";
9
- import {SgdsButton} from "../Button";
10
- import {classMap} from 'lit/directives/class-map.js';
11
- import styles from "./sgds-quantitytoggle.scss";
12
-
13
- @customElement("sgds-quantitytoggle")
14
- export class SgdsQuantityToggle extends SgdsElement {
15
- @query('input.form-control') input: HTMLInputElement;
16
- @query('sgds-button.button-group_button-first') leftBtn: SgdsButton;
17
- @query('sgds-button.button-group_button-last') lastBtn: SgdsButton;
18
- static styles = styles;
19
-
20
-
21
- @property({ reflect: true, type: String}) quantToggleId = genId("quantToggle", "toggle");
22
-
23
- @property({reflect: true}) name : string;
24
- /** The input's minimum value. */
25
- @property() min: number | string;
26
- /** The input's maximum value. */
27
- @property() max: number | string;
28
-
29
- @property() size : 'sm' | 'lg' | "default" = "sm" ;
30
-
31
- @property ({reflect: true}) count : number | string;
32
-
33
- @property({ type: Boolean, reflect: true }) disabled = false;
34
-
35
- @property({ reflect: true }) quantityToggleClasses? : string;
36
-
37
- /**
38
- * Specifies the granularity that the value must adhere to, or the special value `any` which means no stepping is
39
- * implied, allowing any numeric value.
40
- */
41
- @property() step = 1 ;
42
-
43
- /** Gets or sets the default value used to reset this element. The initial value corresponds to the one originally specified in the HTML that created this element. */
44
- @defaultValue()
45
- defaultValue = '';
46
-
47
- handleChange(event: string){
48
- this.emit(event);
49
- this.count = this.input.value;
50
- }
51
- onPlus(event:MouseEvent){
52
- if (this.disabled) {
53
- event.preventDefault();
54
- event.stopPropagation();
55
- return;
56
- }
57
- this.count = parseInt(this.input.value) + parseInt(this.input.step);
58
- };
59
- onMinus(event:MouseEvent){
60
- if (this.disabled) {
61
- event.preventDefault();
62
- event.stopPropagation();
63
- return;
64
- }
65
- if (this.count < this.step) {
66
- this.count = 0;
67
- }
68
- else {
69
- this.count = parseInt(this.input.value) - parseInt(this.input.step);
70
- }
71
-
72
- };
73
-
74
-
75
-
76
- @watch('count', { waitUntilFirstUpdate: true })
77
-
78
- render() {
79
- return html`
80
- <div
81
- part="base"
82
- class="${classMap(
83
- {
84
- "sgds" : true,
85
- 'disabled': this.disabled,
86
- "input-group" : true,
87
- [`${this.quantityToggleClasses}`]: this.quantityToggleClasses
88
- })}"
89
- variant="quantity-toggle"
90
- id=${this.quantToggleId}
91
- size=${this.size}
92
- >
93
- <sgds-button
94
- part="button"
95
- variant="primary"
96
- class="button-group_button-first"
97
- size=${this.size}
98
- @click=${this.onMinus}
99
- ?disabled=${this.disabled}
100
- >
101
- <sl-icon name="dash-lg"></sl-icon>
102
- </sgds-button>
103
- <input
104
- type="number"
105
- class="form-control ${"form-control-" + this.size} text-center"
106
- name=${ifDefined(this.name)}
107
- step=${ifDefined(this.step as number)}
108
- min=${ifDefined(this.min)}
109
- max=${ifDefined(this.max)}
110
- .value=${live(this.count as string)}
111
- @change=${()=> this.handleChange('sgds-change')}
112
- @input=${()=> this.handleChange('sgds-input')}
113
- ?disabled=${this.disabled}
114
- >
115
- <sgds-button
116
- part="button"
117
- variant="primary"
118
- class="button-group_button-last"
119
- size=${this.size}
120
- @click=${this.onPlus}
121
- ?disabled=${this.disabled}
122
- >
123
- <sl-icon name="plus-lg"></sl-icon>
124
- </sgds-button>
125
- </div>
126
- `;
127
- }
128
- }
129
-
130
- export default SgdsQuantityToggle;
@@ -1,2 +0,0 @@
1
- export { SgdsRadio } from "./sgds-radio";
2
- export { SgdsRadioGroup } from "./sgds-radiogroup";
@@ -1,5 +0,0 @@
1
- @import "../utils/base.scss";
2
- @import "~@govtechsg/sgds/sass/forms/form-check";
3
- @import "~@govtechsg/sgds/sass/forms/labels";
4
-
5
-
@@ -1,120 +0,0 @@
1
- import { html } from "lit";
2
- import { customElement, property, state } from "lit/decorators.js";
3
- import { classMap } from "lit/directives/class-map.js";
4
- import { watch } from "../utils/watch";
5
- import styles from "./sgds-radio.scss";
6
- import SgdsElement from "../utils/sgds-element";
7
- import { ifDefined } from "lit/directives/if-defined.js";
8
- import { live } from "lit/directives/live.js";
9
- import genId from "../utils/generateId";
10
-
11
-
12
- @customElement("sgds-radio")
13
- export class SgdsRadio extends SgdsElement {
14
- static styles = styles;
15
-
16
- @state() checked = false;
17
- @state() protected hasFocus = false;
18
-
19
- /** The radio's value attribute. */
20
- @property() value: string;
21
-
22
- /** For id/for pair of the HTML form control. */
23
- @property({ type: String, reflect: true }) radioId = genId("radio");
24
-
25
- /** Disables the radio. */
26
- @property({ type: Boolean, reflect: true }) disabled = false;
27
-
28
- /** Aligns the radios horizontally */
29
- @property({ type: Boolean, reflect: true }) isInline = false;
30
-
31
- /** For aria-label */
32
- @property({ type: String, reflect: true }) ariaLabel = "";
33
-
34
- connectedCallback(): void {
35
- super.connectedCallback();
36
- this.setInitialAttributes();
37
- this.addEventListeners();
38
- }
39
-
40
- @watch("checked")
41
- handleCheckedChange() {
42
- this.setAttribute("aria-checked", this.checked ? "true" : "false");
43
- this.setAttribute("tabindex", this.checked ? "0" : "-1");
44
- }
45
-
46
- @watch("disabled", { waitUntilFirstUpdate: true })
47
- handleDisabledChange() {
48
- this.setAttribute("aria-disabled", this.disabled ? "true" : "false");
49
- }
50
-
51
- private handleBlur() {
52
- this.hasFocus = false;
53
- this.emit('sgds-blur');
54
- }
55
-
56
- private handleClick() {
57
- if (!this.disabled) {
58
- this.checked = true;
59
- }
60
- }
61
-
62
- private handleFocus() {
63
- this.hasFocus = true;
64
- this.emit('sgds-focus');
65
- }
66
-
67
- private addEventListeners() {
68
- this.addEventListener('blur', () => this.handleBlur());
69
- this.addEventListener('click', () => this.handleClick());
70
- this.addEventListener('focus', () => this.handleFocus());
71
- }
72
-
73
- private setInitialAttributes() {
74
- this.setAttribute("role", "radio");
75
- this.setAttribute("tabindex", "-1");
76
- this.setAttribute("aria-disabled", this.disabled ? "true" : "false");
77
- }
78
-
79
- render() {
80
- return html`
81
- <div
82
- part="base"
83
- class=${classMap({
84
- "form-check": true,
85
- "form-check-inline": this.isInline,
86
- })}
87
- >
88
- <input
89
- part="control"
90
- class=${classMap({
91
- "form-check-input": true,
92
- })}
93
- type="radio"
94
- id=${ifDefined(this.radioId)}
95
- value=${ifDefined(this.value)}
96
- .checked=${live(this.checked)}
97
- ?disabled=${this.disabled}
98
- aria-disabled=${this.disabled ? "true" : "false"}
99
- aria-checked=${this.checked ? "true" : "false"}
100
- @click=${this.handleClick}
101
- />
102
- <label
103
- part="label"
104
- for="${ifDefined(this.radioId)}"
105
- aria-label=${ifDefined(this.ariaLabel)}
106
- class="form-check-label"
107
- ><slot></slot
108
- ></label>
109
- </div>
110
- `;
111
- }
112
- }
113
-
114
- declare global {
115
- interface HTMLElementTagNameMap {
116
- 'sgds-radio': SgdsRadio;
117
- }
118
- }
119
-
120
- export default SgdsRadio;
@@ -1,22 +0,0 @@
1
- @import "../utils/base.scss";
2
- @import "~@govtechsg/sgds/sass/forms/form-check";
3
- @import "~@govtechsg/sgds/sass/forms/labels";
4
- @import "~@govtechsg/sgds/sass/forms/validation";
5
- @import "~@govtechsg/sgds/sass/forms/form-text";
6
- @import "~@govtechsg/sgds/sass/forms/form-control";
7
- @import "~@govtechsg/sgds/sass/forms/form-control-group";
8
- @import "~@govtechsg/sgds/sass/forms/input-group";
9
-
10
- .visually-hidden {
11
- position: absolute;
12
- width: 1px;
13
- height: 1px;
14
- padding: 0;
15
- margin: -1px;
16
- overflow: hidden;
17
- clip: rect(0, 0, 0, 0);
18
- white-space: nowrap;
19
- border: 0;
20
- }
21
-
22
-