@govtechsg/sgds-web-component 0.0.7 → 0.0.10
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.
- package/.github/workflows/publish-latest.yml +22 -0
- package/.github/workflows/publish-pr.yml +28 -0
- package/.husky/commit-msg +4 -0
- package/.husky/prepare-commit-msg +8 -0
- package/.storybook/main.js +16 -0
- package/.storybook/preview-head.html +11 -0
- package/.storybook/preview.js +9 -0
- package/.vscode/settings.json +7 -0
- package/CONTRIBUTING.md +56 -0
- package/LICENSE +20 -0
- package/amplify.yml +22 -0
- package/commitlint.config.js +1 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/button-element.scss.html +112 -0
- package/coverage/lcov-report/button-element.ts.html +145 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +116 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +196 -0
- package/coverage/lcov.info +32 -0
- package/index.html +430 -0
- package/{Button → lib/Button}/index.d.ts +0 -0
- package/{Button → lib/Button}/index.js +304 -39
- package/lib/Button/index.js.map +1 -0
- package/{Button → lib/Button}/package.json +0 -0
- package/lib/Button/sgds-button.d.ts +48 -0
- package/lib/Card/index.d.ts +1 -0
- package/lib/Card/index.js +6150 -0
- package/lib/Card/index.js.map +1 -0
- package/lib/Card/package.json +7 -0
- package/lib/Card/sgds-action-card.d.ts +20 -0
- package/lib/Checkbox/index.d.ts +1 -0
- package/lib/Checkbox/index.js +6366 -0
- package/lib/Checkbox/index.js.map +1 -0
- package/lib/Checkbox/package.json +7 -0
- package/lib/Checkbox/sgds-checkbox.d.ts +36 -0
- package/lib/Dropdown/index.d.ts +3 -0
- package/{Mainnav → lib/Dropdown}/index.js +2786 -9258
- package/lib/Dropdown/index.js.map +1 -0
- package/lib/Dropdown/package.json +7 -0
- package/lib/Dropdown/sgds-dropdown-item.d.ts +7 -0
- package/lib/Dropdown/sgds-dropdown.d.ts +7 -0
- package/{Footer → lib/Footer}/index.d.ts +0 -0
- package/{Footer → lib/Footer}/index.js +111 -95
- package/lib/Footer/index.js.map +1 -0
- package/{Footer → lib/Footer}/package.json +0 -0
- package/{Footer → lib/Footer}/sgds-footer.d.ts +2 -2
- package/lib/Input/index.d.ts +1 -0
- package/lib/Input/index.js +6656 -0
- package/lib/Input/index.js.map +1 -0
- package/lib/Input/package.json +7 -0
- package/lib/Input/sgds-input.d.ts +42 -0
- package/{Mainnav → lib/Mainnav}/index.d.ts +1 -0
- package/{index.js → lib/Mainnav/index.js} +3876 -23415
- package/lib/Mainnav/index.js.map +1 -0
- package/{Mainnav → lib/Mainnav}/package.json +0 -0
- package/lib/Mainnav/sgds-mainnav-dropdown.d.ts +5 -0
- package/lib/Mainnav/sgds-mainnav-item.d.ts +4 -0
- package/{Mainnav → lib/Mainnav}/sgds-mainnav.d.ts +3 -2
- package/{Masthead → lib/Masthead}/index.d.ts +0 -0
- package/{Masthead → lib/Masthead}/index.js +140 -114
- package/lib/Masthead/index.js.map +1 -0
- package/{Masthead → lib/Masthead}/package.json +0 -0
- package/{Masthead → lib/Masthead}/sgds-masthead.d.ts +1 -1
- package/lib/Modal/index.d.ts +1 -0
- package/lib/Modal/index.js +6432 -0
- package/lib/Modal/index.js.map +1 -0
- package/lib/Modal/package.json +7 -0
- package/lib/Modal/sgds-modal.d.ts +28 -0
- package/lib/QuantityToggle/index.d.ts +1 -0
- package/lib/QuantityToggle/index.js +7049 -0
- package/lib/QuantityToggle/index.js.map +1 -0
- package/lib/QuantityToggle/package.json +7 -0
- package/lib/QuantityToggle/sgds-quantitytoggle.d.ts +30 -0
- package/lib/Radio/index.d.ts +2 -0
- package/lib/Radio/index.js +12607 -0
- package/lib/Radio/index.js.map +1 -0
- package/lib/Radio/package.json +7 -0
- package/lib/Radio/sgds-radio.d.ts +31 -0
- package/lib/Radio/sgds-radiogroup.d.ts +41 -0
- package/{Sidenav → lib/Sidenav}/index.d.ts +0 -0
- package/{Sidenav → lib/Sidenav}/index.js +2266 -2171
- package/lib/Sidenav/index.js.map +1 -0
- package/{Sidenav → lib/Sidenav}/package.json +0 -0
- package/{Sidenav → lib/Sidenav}/sgds-sidenav-item.d.ts +2 -1
- package/lib/Sidenav/sgds-sidenav-link.d.ts +4 -0
- package/{Sidenav → lib/Sidenav}/sgds-sidenav.d.ts +1 -1
- package/lib/Tab/index.d.ts +3 -0
- package/lib/Tab/index.js +13557 -0
- package/lib/Tab/index.js.map +1 -0
- package/lib/Tab/package.json +7 -0
- package/lib/Tab/sgds-tab.d.ts +26 -0
- package/lib/Tab/sgds-tabgroup.d.ts +47 -0
- package/lib/Tab/sgds-tabpanel.d.ts +25 -0
- package/lib/Textarea/index.d.ts +1 -0
- package/lib/Textarea/index.js +6696 -0
- package/lib/Textarea/index.js.map +1 -0
- package/lib/Textarea/package.json +7 -0
- package/lib/Textarea/sgds-textarea.d.ts +53 -0
- package/lib/index.d.ts +16 -0
- package/lib/index.js +134580 -0
- package/lib/index.js.map +1 -0
- package/lib/umd/index.js +134587 -0
- package/lib/umd/index.js.map +1 -0
- package/lib/utils/animate.d.ts +10 -0
- package/lib/utils/animation-registry.d.ts +18 -0
- package/{utils → lib/utils}/breakpoints.d.ts +0 -0
- package/lib/utils/card-element.d.ts +11 -0
- package/lib/utils/defaultvalue.d.ts +2 -0
- package/lib/utils/dropdown-element.d.ts +37 -0
- package/lib/utils/event.d.ts +2 -0
- package/lib/utils/form.d.ts +38 -0
- package/{utils → lib/utils}/generateId.d.ts +0 -0
- package/lib/utils/link-element.d.ts +7 -0
- package/lib/utils/mergeDeep.d.ts +2 -0
- package/lib/utils/modal.d.ts +12 -0
- package/lib/utils/object.d.ts +2 -0
- package/lib/utils/offset.d.ts +4 -0
- package/lib/utils/scroll.d.ts +13 -0
- package/{utils → lib/utils}/sgds-element.d.ts +0 -0
- package/lib/utils/slot.d.ts +22 -0
- package/lib/utils/tabbable.d.ts +8 -0
- package/lib/utils/watch.d.ts +14 -0
- package/mocks/dropdown.d.ts +4 -0
- package/mocks/dropdown.ts +27 -0
- package/mocks/link.d.ts +3 -0
- package/mocks/link.ts +6 -0
- package/package.json +65 -10
- package/rollup.config.js +73 -0
- package/rollup.test.config.js +42 -0
- package/scripts/buildUtils.js +30 -0
- package/scripts/frankBuild.js +49 -0
- package/src/Button/index.ts +1 -0
- package/src/Button/sgds-button.scss +28 -0
- package/src/Button/sgds-button.ts +153 -0
- package/src/Card/index.ts +1 -0
- package/src/Card/sgds-action-card.scss +27 -0
- package/src/Card/sgds-action-card.ts +115 -0
- package/src/Checkbox/index.ts +1 -0
- package/src/Checkbox/sgds-checkbox.scss +4 -0
- package/src/Checkbox/sgds-checkbox.ts +149 -0
- package/src/Dropdown/index.ts +3 -0
- package/src/Dropdown/sgds-dropdown-item.ts +39 -0
- package/src/Dropdown/sgds-dropdown.scss +5 -0
- package/src/Dropdown/sgds-dropdown.ts +54 -0
- package/src/Footer/index.ts +3 -0
- package/src/Footer/sgds-footer.scss +5 -0
- package/src/Footer/sgds-footer.ts +121 -0
- package/src/Input/index.ts +1 -0
- package/src/Input/sgds-input.scss +20 -0
- package/src/Input/sgds-input.ts +178 -0
- package/src/Mainnav/index.ts +4 -0
- package/src/Mainnav/sgds-mainnav-dropdown.scss +13 -0
- package/src/Mainnav/sgds-mainnav-dropdown.ts +45 -0
- package/src/Mainnav/sgds-mainnav-item.scss +24 -0
- package/src/Mainnav/sgds-mainnav-item.ts +8 -0
- package/src/Mainnav/sgds-mainnav.scss +39 -0
- package/src/Mainnav/sgds-mainnav.ts +183 -0
- package/src/Masthead/index.ts +1 -0
- package/src/Masthead/sgds-masthead.scss +217 -0
- package/src/Masthead/sgds-masthead.ts +189 -0
- package/src/Modal/index.ts +1 -0
- package/src/Modal/sgds-modal.scss +128 -0
- package/src/Modal/sgds-modal.ts +309 -0
- package/src/QuantityToggle/index.ts +1 -0
- package/src/QuantityToggle/sgds-quantitytoggle.scss +10 -0
- package/src/QuantityToggle/sgds-quantitytoggle.ts +130 -0
- package/src/Radio/index.ts +2 -0
- package/src/Radio/sgds-radio.scss +5 -0
- package/src/Radio/sgds-radio.ts +120 -0
- package/src/Radio/sgds-radiogroup.scss +22 -0
- package/src/Radio/sgds-radiogroup.ts +221 -0
- package/src/Sidenav/index.ts +4 -0
- package/src/Sidenav/sgds-sidenav-item.scss +73 -0
- package/src/Sidenav/sgds-sidenav-item.ts +145 -0
- package/src/Sidenav/sgds-sidenav-link.scss +25 -0
- package/src/Sidenav/sgds-sidenav-link.ts +8 -0
- package/src/Sidenav/sgds-sidenav.scss +6 -0
- package/src/Sidenav/sgds-sidenav.ts +33 -0
- package/src/Tab/index.ts +3 -0
- package/src/Tab/sgds-tab.scss +84 -0
- package/src/Tab/sgds-tab.ts +87 -0
- package/src/Tab/sgds-tabgroup.scss +198 -0
- package/src/Tab/sgds-tabgroup.ts +295 -0
- package/src/Tab/sgds-tabpanel.scss +12 -0
- package/src/Tab/sgds-tabpanel.ts +55 -0
- package/src/Textarea/index.ts +1 -0
- package/src/Textarea/sgds-textarea.scss +23 -0
- package/src/Textarea/sgds-textarea.ts +201 -0
- package/src/index.ts +16 -0
- package/src/utils/animate.ts +69 -0
- package/src/utils/animation-registry.ts +71 -0
- package/src/utils/base.scss +14 -0
- package/src/utils/breakpoints.ts +5 -0
- package/src/utils/card-element.ts +42 -0
- package/src/utils/components.style.scss +531 -0
- package/src/utils/defaultvalue.ts +51 -0
- package/src/utils/dropdown-element.ts +244 -0
- package/src/utils/event.ts +13 -0
- package/src/utils/form.ts +183 -0
- package/src/utils/generateId.ts +4 -0
- package/src/utils/link-element.ts +34 -0
- package/src/utils/mergeDeep.ts +22 -0
- package/src/utils/modal.ts +64 -0
- package/src/utils/object.ts +2 -0
- package/src/utils/offset.ts +6 -0
- package/src/utils/scroll.ts +57 -0
- package/src/utils/sgds-element.ts +18 -0
- package/src/utils/slot.ts +102 -0
- package/src/utils/tabbable.ts +81 -0
- package/src/utils/watch.ts +62 -0
- package/stories/ActionCard.stories.mdx +199 -0
- package/stories/Button.stories.mdx +194 -0
- package/stories/Checkbox.stories.mdx +196 -0
- package/stories/Dropdown.stories.mdx +152 -0
- package/stories/Footer.stories.mdx +261 -0
- package/stories/Input.stories.mdx +236 -0
- package/stories/MainNav.stories.mdx +169 -0
- package/stories/Masthead.stories.mdx +112 -0
- package/stories/Modal.stories.mdx +103 -0
- package/stories/QuantityToggle.stories.mdx +97 -0
- package/stories/Radio.stories.mdx +262 -0
- package/stories/Sample.stories.js +29 -0
- package/stories/Sample.stories.mdx +33 -0
- package/stories/SideNav.stories.mdx +245 -0
- package/stories/common.js +185 -0
- package/stories/textarea.stories.mdx +253 -0
- package/test/button.element.test.ts +185 -0
- package/test/checkbox.test.ts +240 -0
- package/test/dropdown.test.ts +637 -0
- package/test/footer.test.ts +181 -0
- package/test/generateId.test.ts +18 -0
- package/test/input.element.test.ts +316 -0
- package/test/link-element.test.ts +38 -0
- package/test/mainnav.test.ts +313 -0
- package/test/masthead.test.ts +116 -0
- package/test/modal.test.ts +149 -0
- package/test/quantitytoggle.test.ts +76 -0
- package/test/radio.test.ts +310 -0
- package/test/selectable-card.test.ts +159 -0
- package/test/sidenav.test.ts +390 -0
- package/test/tab.test.ts +76 -0
- package/test/textarea.test.ts +126 -0
- package/tsconfig.json +26 -0
- package/tsconfig.test.json +24 -0
- package/typings/scss.d.ts +5 -0
- package/web-dev-server.config.mjs +7 -0
- package/web-test-runner.config.mjs +47 -0
- package/Button/index.js.map +0 -1
- package/Button/sgds-button.d.ts +0 -23
- package/Footer/index.js.map +0 -1
- package/Mainnav/index.js.map +0 -1
- package/Mainnav/sgds-mainnav-item.d.ts +0 -7
- package/Masthead/index.js.map +0 -1
- package/Sidenav/index.js.map +0 -1
- package/Sidenav/sgds-sidenav-link.d.ts +0 -7
- package/index.d.ts +0 -5
- package/index.js.map +0 -1
- package/umd/index.js +0 -52092
- package/umd/index.js.map +0 -1
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
export const partDescription = `Name of the part attribute of element in shadow tree. Use ::part CSS pseudo-element to modify the styles of the targeted element`;
|
|
2
|
+
|
|
3
|
+
export const dropdownElementProps = (componentName, disableControl = false) => {
|
|
4
|
+
const argsObj = {
|
|
5
|
+
drop: {
|
|
6
|
+
control: "select",
|
|
7
|
+
options: ["down", "up", "left", "right"],
|
|
8
|
+
defaultValue: "down",
|
|
9
|
+
description: "The drop position of menu relative to the toggle button",
|
|
10
|
+
table: {
|
|
11
|
+
category: `props: ${componentName}`,
|
|
12
|
+
defaultValue: { summary: "down" },
|
|
13
|
+
type: {
|
|
14
|
+
summary: "DropDirection",
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
menuAlignRight: {
|
|
19
|
+
control: "boolean",
|
|
20
|
+
description:
|
|
21
|
+
"When true, aligns right edge of menu with right edge of button ",
|
|
22
|
+
table: {
|
|
23
|
+
defaultValue: { summary: "false" },
|
|
24
|
+
category: `props: ${componentName}`,
|
|
25
|
+
type: { summary: "boolean" },
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
menuIsOpen: {
|
|
29
|
+
control: "disable",
|
|
30
|
+
description: "When true, dropdown menu shows on first load",
|
|
31
|
+
table: {
|
|
32
|
+
defaultValue: { summary: "false" },
|
|
33
|
+
category: `props: ${componentName}`,
|
|
34
|
+
type: { summary: "boolean" },
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
noFlip: {
|
|
38
|
+
control: "boolean",
|
|
39
|
+
description: "Controls auto-flipping of menu",
|
|
40
|
+
table: {
|
|
41
|
+
category: `props: ${componentName}`,
|
|
42
|
+
type: {
|
|
43
|
+
defaultValue: { summary: "false" },
|
|
44
|
+
summary: "boolean",
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
popperOpts: {
|
|
49
|
+
control: "object",
|
|
50
|
+
description:
|
|
51
|
+
"Additional configuration to pass to Popper.js. See https://popper.js.org/ for config opts",
|
|
52
|
+
table: {
|
|
53
|
+
category: `props: ${componentName}`,
|
|
54
|
+
defaultValue: { summary: "{}" },
|
|
55
|
+
type: {
|
|
56
|
+
summary: "object",
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
togglerId: {
|
|
61
|
+
control: "text",
|
|
62
|
+
description:
|
|
63
|
+
"Forwards value to id attribute of toggle button of Dropdown. An unique id generated by default",
|
|
64
|
+
table: {
|
|
65
|
+
category: `props: ${componentName}`,
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
togglerText: {
|
|
69
|
+
control: "text",
|
|
70
|
+
description: "Sets the text content of Dropdown button ",
|
|
71
|
+
table: {
|
|
72
|
+
defaultValue: { summary: "" },
|
|
73
|
+
category: `props: ${componentName}`,
|
|
74
|
+
type: {
|
|
75
|
+
summary: "string",
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
variant: {
|
|
80
|
+
control: "select",
|
|
81
|
+
description: "Sets color of Dropdown button",
|
|
82
|
+
options: [
|
|
83
|
+
"primary",
|
|
84
|
+
"secondary",
|
|
85
|
+
"success",
|
|
86
|
+
"danger",
|
|
87
|
+
"warning",
|
|
88
|
+
"info",
|
|
89
|
+
"light",
|
|
90
|
+
"dark",
|
|
91
|
+
],
|
|
92
|
+
table: {
|
|
93
|
+
category: `props: ${componentName}`,
|
|
94
|
+
defaultValue: { summary: "secondary" },
|
|
95
|
+
type: {
|
|
96
|
+
summary: "DropdownButtonVariant",
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
close: {
|
|
101
|
+
control: "select",
|
|
102
|
+
options: ["default", "outside", "inside"],
|
|
103
|
+
description:
|
|
104
|
+
"Controls the close behaviour of dropdown menu. By default menu auto-closes when SgdsDropdownItem or area outside dropdown is clicked",
|
|
105
|
+
table: {
|
|
106
|
+
defaultValue: { summary: "default" },
|
|
107
|
+
category: `props: ${componentName}`,
|
|
108
|
+
type: {
|
|
109
|
+
summary: "string",
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
dropdownDisabled: {
|
|
114
|
+
name: "disabled",
|
|
115
|
+
control: "boolean",
|
|
116
|
+
description: "Disables the dropdown toggle",
|
|
117
|
+
table: {
|
|
118
|
+
defaultValue: { summary: "false" },
|
|
119
|
+
category: `props: ${componentName}`,
|
|
120
|
+
type: {
|
|
121
|
+
summary: "string",
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
"sgds-select": {
|
|
126
|
+
description:
|
|
127
|
+
"Emitted event from SgdsDropdown element when a the slot item is selected/clicked",
|
|
128
|
+
table: {
|
|
129
|
+
category: `Event: ${componentName}`,
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
"sgds-show": {
|
|
133
|
+
description: "Emitted event when show instance is called ",
|
|
134
|
+
table: {
|
|
135
|
+
category: `Event: ${componentName}`,
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
"sgds-shown": {
|
|
139
|
+
description:
|
|
140
|
+
"Emitted event when dropdown has been made visible to the user and CSS transitions have completed",
|
|
141
|
+
table: {
|
|
142
|
+
category: `Event: ${componentName}`,
|
|
143
|
+
},
|
|
144
|
+
},
|
|
145
|
+
"sgds-hide": {
|
|
146
|
+
description: "Emitted event when hide instance is called",
|
|
147
|
+
table: {
|
|
148
|
+
category: `Event: ${componentName}`,
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
"sgds-hidden": {
|
|
152
|
+
description:
|
|
153
|
+
"Emitted event when the dropdown has finished being hidden from the user and CSS transitions have completed",
|
|
154
|
+
table: {
|
|
155
|
+
category: `Event: ${componentName}`,
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
showMenu: {
|
|
159
|
+
control: "disable",
|
|
160
|
+
description: "When invoked, opens the dropdown menu",
|
|
161
|
+
table: {
|
|
162
|
+
category: `Method: ${componentName}`,
|
|
163
|
+
type: {
|
|
164
|
+
summary: "function",
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
},
|
|
168
|
+
hideMenu: {
|
|
169
|
+
control: "disable",
|
|
170
|
+
description: "When invoked, hides the dropdown menu",
|
|
171
|
+
table: {
|
|
172
|
+
category: `Method: ${componentName}`,
|
|
173
|
+
type: {
|
|
174
|
+
summary: "function",
|
|
175
|
+
},
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
};
|
|
179
|
+
if (disableControl) {
|
|
180
|
+
for (const [key, value] of Object.entries(argsObj)) {
|
|
181
|
+
value.control = "disable";
|
|
182
|
+
}
|
|
183
|
+
return argsObj
|
|
184
|
+
} else return argsObj
|
|
185
|
+
};
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import { Canvas, Meta, Story, ArgsTable } from "@storybook/addon-docs";
|
|
2
|
+
import { html } from "lit-html";
|
|
3
|
+
import "../lib/Textarea";
|
|
4
|
+
|
|
5
|
+
<Meta
|
|
6
|
+
title="Components/Textarea"
|
|
7
|
+
argTypes={{
|
|
8
|
+
name:{
|
|
9
|
+
control: "text",
|
|
10
|
+
table:{
|
|
11
|
+
category: "props",
|
|
12
|
+
type: { summary: "string" },
|
|
13
|
+
},
|
|
14
|
+
description: "The textarea's name attribute"
|
|
15
|
+
},
|
|
16
|
+
label:{
|
|
17
|
+
control: "text",
|
|
18
|
+
defaultValue: 'Label',
|
|
19
|
+
table:{
|
|
20
|
+
category: "props",
|
|
21
|
+
type: { summary: "string" },
|
|
22
|
+
},
|
|
23
|
+
description: "The textarea's label"
|
|
24
|
+
},
|
|
25
|
+
textareaId:{
|
|
26
|
+
control: 'text',
|
|
27
|
+
defaultValue: 'textarea',
|
|
28
|
+
table:{
|
|
29
|
+
category: "props",
|
|
30
|
+
type: { summary: "string" },
|
|
31
|
+
},
|
|
32
|
+
description: "The textarea's unique id"
|
|
33
|
+
},
|
|
34
|
+
textareaClasses: {
|
|
35
|
+
control: "text",
|
|
36
|
+
table:{
|
|
37
|
+
category: "props",
|
|
38
|
+
type: { summary: "string" },
|
|
39
|
+
},
|
|
40
|
+
description: 'Can be used to insert any classes such as `mt-2`'
|
|
41
|
+
},
|
|
42
|
+
value:{
|
|
43
|
+
control: 'text',
|
|
44
|
+
defaultValue: "",
|
|
45
|
+
table:{
|
|
46
|
+
category: "props",
|
|
47
|
+
type: { summary: "string" },
|
|
48
|
+
},
|
|
49
|
+
description:"The textarea's value attribute."
|
|
50
|
+
},
|
|
51
|
+
rows:{
|
|
52
|
+
control: 'number',
|
|
53
|
+
defaultValue: 4,
|
|
54
|
+
table:{
|
|
55
|
+
category: "props",
|
|
56
|
+
type: { summary: "number" },
|
|
57
|
+
},
|
|
58
|
+
description:"The number of rows to display by default."
|
|
59
|
+
},
|
|
60
|
+
placeholder:{
|
|
61
|
+
control: 'text',
|
|
62
|
+
defaultValue: "this is a placeholder text",
|
|
63
|
+
table:{
|
|
64
|
+
category: "props",
|
|
65
|
+
type: { summary: "string" },
|
|
66
|
+
},
|
|
67
|
+
description:"The textarea's placeholder text."
|
|
68
|
+
},
|
|
69
|
+
invalidFeedback:{
|
|
70
|
+
control:'text',
|
|
71
|
+
defaultValue: "Please key in 5 letters",
|
|
72
|
+
table:{
|
|
73
|
+
category: "props",
|
|
74
|
+
type: { summary: "string" },
|
|
75
|
+
},
|
|
76
|
+
description: 'Feedback text for error state when validated'
|
|
77
|
+
},
|
|
78
|
+
autofocus:{
|
|
79
|
+
control:'boolean',
|
|
80
|
+
defaultValue: false,
|
|
81
|
+
table:{
|
|
82
|
+
category: "props",
|
|
83
|
+
type: { summary: "boolean" },
|
|
84
|
+
},
|
|
85
|
+
description: 'Autofocus the input'
|
|
86
|
+
},
|
|
87
|
+
disabled:{
|
|
88
|
+
control:'boolean',
|
|
89
|
+
defaultValue: false,
|
|
90
|
+
table:{
|
|
91
|
+
category: "props",
|
|
92
|
+
type: { summary: "boolean" },
|
|
93
|
+
},
|
|
94
|
+
description: 'Disables the input.'
|
|
95
|
+
},
|
|
96
|
+
required:{
|
|
97
|
+
control:'boolean',
|
|
98
|
+
defaultValue: false,
|
|
99
|
+
table:{
|
|
100
|
+
category: "props",
|
|
101
|
+
type: { summary: "boolean" },
|
|
102
|
+
},
|
|
103
|
+
description: 'Makes the input a required field.'
|
|
104
|
+
},
|
|
105
|
+
readonly:{
|
|
106
|
+
control:'boolean',
|
|
107
|
+
defaultValue: false,
|
|
108
|
+
table:{
|
|
109
|
+
category: "props",
|
|
110
|
+
type: { summary: "boolean" },
|
|
111
|
+
},
|
|
112
|
+
description: 'Makes the input a read only field'
|
|
113
|
+
},
|
|
114
|
+
minlength:{
|
|
115
|
+
control:'text',
|
|
116
|
+
defaultValue: "0",
|
|
117
|
+
table:{
|
|
118
|
+
category: "props",
|
|
119
|
+
type: { summary: "string" },
|
|
120
|
+
},
|
|
121
|
+
description: 'Sets the minimum length of the input'
|
|
122
|
+
},
|
|
123
|
+
maxlength:{
|
|
124
|
+
control:'text',
|
|
125
|
+
defaultValue: "100",
|
|
126
|
+
table:{
|
|
127
|
+
category: "props",
|
|
128
|
+
type: { summary: "string" },
|
|
129
|
+
},
|
|
130
|
+
description: 'Sets the maximum length of the input'
|
|
131
|
+
},
|
|
132
|
+
spellcheck:{
|
|
133
|
+
control:'boolean',
|
|
134
|
+
defaultValue: false,
|
|
135
|
+
table:{
|
|
136
|
+
category: "props",
|
|
137
|
+
type: { summary: "boolean" },
|
|
138
|
+
},
|
|
139
|
+
description: 'Enables spell checking on the textarea'
|
|
140
|
+
},
|
|
141
|
+
autocorrect:{
|
|
142
|
+
control:'select',
|
|
143
|
+
options: [
|
|
144
|
+
'on',
|
|
145
|
+
'off',
|
|
146
|
+
],
|
|
147
|
+
defaultValue: "off",
|
|
148
|
+
table:{
|
|
149
|
+
category: "props",
|
|
150
|
+
type: { summary: "string" },
|
|
151
|
+
},
|
|
152
|
+
description: "The textarea's autocorrect attribute."
|
|
153
|
+
},
|
|
154
|
+
resize:{
|
|
155
|
+
control:'select',
|
|
156
|
+
options: [
|
|
157
|
+
'none',
|
|
158
|
+
'vertical',
|
|
159
|
+
],
|
|
160
|
+
defaultValue: "none",
|
|
161
|
+
table:{
|
|
162
|
+
category: "props",
|
|
163
|
+
type: { summary: "string" },
|
|
164
|
+
},
|
|
165
|
+
description: "Controls how the textarea can be resized."
|
|
166
|
+
},
|
|
167
|
+
'sgds-change':{
|
|
168
|
+
table:{
|
|
169
|
+
category: "Events",
|
|
170
|
+
type: { summary: "Event" },
|
|
171
|
+
},
|
|
172
|
+
description: "Emitted when an alteration to the control's value is committed by the user"
|
|
173
|
+
},
|
|
174
|
+
'sgds-input':{
|
|
175
|
+
table:{
|
|
176
|
+
category: "Events",
|
|
177
|
+
type: { summary: "Event" },
|
|
178
|
+
},
|
|
179
|
+
description: 'Emitted when the control receives input and its value changes.'
|
|
180
|
+
},
|
|
181
|
+
'sgds-focus':{
|
|
182
|
+
table:{
|
|
183
|
+
category: "Events",
|
|
184
|
+
type: { summary: "Event" },
|
|
185
|
+
},
|
|
186
|
+
description: "Emitted when textarea is in focus"
|
|
187
|
+
},
|
|
188
|
+
'sgds-blur':{
|
|
189
|
+
table:{
|
|
190
|
+
category: "Events",
|
|
191
|
+
type: { summary: "Event" },
|
|
192
|
+
},
|
|
193
|
+
description: "Emitted when textarea is not focus"
|
|
194
|
+
},
|
|
195
|
+
select:{
|
|
196
|
+
table:{
|
|
197
|
+
category: "Methods",
|
|
198
|
+
type: { summary: "Method" },
|
|
199
|
+
},
|
|
200
|
+
description: "Select textarea content"
|
|
201
|
+
},
|
|
202
|
+
focus:{
|
|
203
|
+
table:{
|
|
204
|
+
category: "Methods",
|
|
205
|
+
type: { summary: "Method" },
|
|
206
|
+
},
|
|
207
|
+
description: "Sets the focus of textarea. <br>Parameters (options: [FocusOptions](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/focus#parameters))",
|
|
208
|
+
},
|
|
209
|
+
}}
|
|
210
|
+
/>
|
|
211
|
+
|
|
212
|
+
export const Template = (args) =>
|
|
213
|
+
html`
|
|
214
|
+
<sgds-textarea
|
|
215
|
+
.label=${args.label}
|
|
216
|
+
.name=${args.name}
|
|
217
|
+
.id=${args.textareaId}
|
|
218
|
+
.textareaClasses=${args.textareaClasses}
|
|
219
|
+
value=${args.value}
|
|
220
|
+
rows=${args.rows}
|
|
221
|
+
.invalidFeedback=${args.invalidFeedback}
|
|
222
|
+
.placeholder=${args.placeholder}
|
|
223
|
+
?autofocus=${args.autofocus}
|
|
224
|
+
?disabled=${args.disabled}
|
|
225
|
+
?required=${args.required}
|
|
226
|
+
?readonly=${args.readonly}
|
|
227
|
+
minlength=${args.minlength}
|
|
228
|
+
maxlength=${args.maxlength}
|
|
229
|
+
?spellcheck=${args.spellcheck}
|
|
230
|
+
?autocorrect=${args.autocorrect}
|
|
231
|
+
resize=${args.resize}
|
|
232
|
+
>
|
|
233
|
+
</sgds-textarea>
|
|
234
|
+
`;
|
|
235
|
+
|
|
236
|
+
# SgdsInput
|
|
237
|
+
|
|
238
|
+
Text inputs allow your users to enter letters, numbers and symbols on a single line.
|
|
239
|
+
|
|
240
|
+
<Canvas>
|
|
241
|
+
<Story name="Basic" args={{ name: "textarea" }}>
|
|
242
|
+
{Template.bind({})}
|
|
243
|
+
</Story>
|
|
244
|
+
</Canvas>
|
|
245
|
+
|
|
246
|
+
## API
|
|
247
|
+
|
|
248
|
+
```jsx
|
|
249
|
+
import { SgdsATextArea } from "@govtechsg/sgds-web-component/Textarea";
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
<ArgsTable story="Basic" />
|
|
253
|
+
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { SgdsButton } from '../src/Button/sgds-button'
|
|
2
|
+
import '../src/Button/sgds-button';
|
|
3
|
+
import {fixture, assert, expect, aTimeout, waitUntil} from '@open-wc/testing';
|
|
4
|
+
import {html} from 'lit';
|
|
5
|
+
import sinon from 'sinon';
|
|
6
|
+
|
|
7
|
+
describe('sgds-button', () => {
|
|
8
|
+
it('is defined', () => {
|
|
9
|
+
const el = document.createElement('sgds-button');
|
|
10
|
+
assert.instanceOf(el, SgdsButton)
|
|
11
|
+
})
|
|
12
|
+
it('renders with default values', async () => {
|
|
13
|
+
const el = await fixture(html`<sgds-button></sgds-button>`);
|
|
14
|
+
assert.shadowDom.equal(
|
|
15
|
+
el,
|
|
16
|
+
`<button class="btn btn-primary sgds" type="button" aria-disabled="false" tabindex="0">
|
|
17
|
+
<slot></slot>
|
|
18
|
+
</button>
|
|
19
|
+
`
|
|
20
|
+
);
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
it('should convert from button tag to anchor tag if href is defined', async () => {
|
|
24
|
+
const el = await fixture(html`<sgds-button href="#"></sgds-button>`);
|
|
25
|
+
const anchorTag = el.shadowRoot?.querySelector("a");
|
|
26
|
+
expect(anchorTag).to.have.attribute('href','#');
|
|
27
|
+
expect(anchorTag).to.have.attribute('role','button');
|
|
28
|
+
expect(anchorTag).not.to.have.attribute('type','button');
|
|
29
|
+
expect(el.shadowRoot?.querySelector("button")).not.to.exist;
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
it('should convert to anchor tag if download and href attributes are defined, button tag', async () => {
|
|
33
|
+
const el = await fixture(html`<sgds-button download="logo.svg" href="folder/subfolder/logo.svg"></sgds-button>`);
|
|
34
|
+
const anchorTag = el.shadowRoot?.querySelector("a");
|
|
35
|
+
expect(anchorTag).to.have.attribute('download','logo.svg');
|
|
36
|
+
expect(el.shadowRoot?.querySelector("button")).not.to.exist;
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
it('anchor tag should contain rel="noreferrer noopener" attribute if href and target="_blank" attributes are defined', async () => {
|
|
40
|
+
const el = await fixture(html`<sgds-button href="#" target="_blank"></sgds-button>`);
|
|
41
|
+
const anchorTag = el.shadowRoot?.querySelector("a");
|
|
42
|
+
expect(anchorTag).to.have.attribute('rel','noreferrer noopener');
|
|
43
|
+
expect(el.shadowRoot?.querySelector("button")).not.to.exist;
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
it('should contain disabled if is an anchor tag and disabled attributes are defined', async () => {
|
|
47
|
+
const el = await fixture(html`<sgds-button href="#" disabled></sgds-button>`);
|
|
48
|
+
const anchorTag = el.shadowRoot?.querySelector("a");
|
|
49
|
+
expect(anchorTag).to.have.class("disabled");
|
|
50
|
+
expect(anchorTag).to.have.attribute('aria-disabled','true');
|
|
51
|
+
expect(anchorTag).to.have.attribute('tabindex','-1');
|
|
52
|
+
expect(anchorTag).not.to.have.attribute('disabled','');
|
|
53
|
+
expect(el.shadowRoot?.querySelector("button")).not.to.exist;
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
it('should emit a click event when calling click()', async () => {
|
|
57
|
+
const el = await fixture<SgdsButton>(html` <sgds-button></sgds-button> `);
|
|
58
|
+
const clickHandler = sinon.spy();
|
|
59
|
+
|
|
60
|
+
el.addEventListener('click', clickHandler);
|
|
61
|
+
el.click();
|
|
62
|
+
await waitUntil(() => clickHandler.calledOnce);
|
|
63
|
+
|
|
64
|
+
expect(clickHandler).to.have.been.calledOnce;
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
describe('when submitting a form', () => {
|
|
72
|
+
it('should submit when the button is inside the form', async () => {
|
|
73
|
+
const form = await fixture<HTMLFormElement>(html`
|
|
74
|
+
<form action="" method="post">
|
|
75
|
+
<sgds-button type="submit"></sgds-button>
|
|
76
|
+
</form>
|
|
77
|
+
`);
|
|
78
|
+
const button = form.querySelector<SgdsButton>('sgds-button')!;
|
|
79
|
+
const handleSubmit = sinon.spy((event: SubmitEvent) => event.preventDefault());
|
|
80
|
+
|
|
81
|
+
form.addEventListener('submit', handleSubmit);
|
|
82
|
+
button.click();
|
|
83
|
+
expect(handleSubmit).to.have.been.calledOnce;
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it('should submit when the button is outside the form and has a form attribute', async () => {
|
|
87
|
+
const el = await fixture(html`
|
|
88
|
+
<div>
|
|
89
|
+
<form id="a" action="" method="post"></form>
|
|
90
|
+
<sgds-button type="submit" form="a">Submit</sgds-button>
|
|
91
|
+
</div>
|
|
92
|
+
`);
|
|
93
|
+
const form = el.querySelector<HTMLFormElement>('form')!;
|
|
94
|
+
const button = el.querySelector<SgdsButton>('sgds-button')!;
|
|
95
|
+
const handleSubmit = sinon.spy((event: SubmitEvent) => event.preventDefault());
|
|
96
|
+
|
|
97
|
+
form.addEventListener('submit', handleSubmit);
|
|
98
|
+
button.click();
|
|
99
|
+
|
|
100
|
+
expect(handleSubmit).to.have.been.calledOnce;
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it('should override form attributes when formaction, formmethod, formnovalidate, and formtarget are used inside a form', async () => {
|
|
104
|
+
const form = await fixture<HTMLFormElement>(html`
|
|
105
|
+
<form id="a" action="foo" method="post" target="_self">
|
|
106
|
+
<sgds-button type="submit" form="a" formaction="bar" formmethod="get" formtarget="_blank" formnovalidate>
|
|
107
|
+
Submit
|
|
108
|
+
</sgds-button>
|
|
109
|
+
</form>
|
|
110
|
+
`);
|
|
111
|
+
const button = form.querySelector<SgdsButton>('sgds-button')!;
|
|
112
|
+
const handleSubmit = sinon.spy((event: SubmitEvent) => {
|
|
113
|
+
submitter = event.submitter as HTMLButtonElement;
|
|
114
|
+
event.preventDefault();
|
|
115
|
+
});
|
|
116
|
+
let submitter!: HTMLButtonElement;
|
|
117
|
+
|
|
118
|
+
form.addEventListener('submit', handleSubmit);
|
|
119
|
+
button.click();
|
|
120
|
+
|
|
121
|
+
expect(handleSubmit).to.have.been.calledOnce;
|
|
122
|
+
expect(submitter.formAction.endsWith('/bar')).to.be.true;
|
|
123
|
+
expect(submitter.formMethod).to.equal('get');
|
|
124
|
+
expect(submitter.formTarget).to.equal('_blank');
|
|
125
|
+
expect(submitter.formNoValidate).to.be.true;
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it('should override form attributes when formaction, formmethod, formnovalidate, and formtarget are used outside a form', async () => {
|
|
129
|
+
const el = await fixture(html`
|
|
130
|
+
<div>
|
|
131
|
+
<form id="a" action="foo" method="post" target="_self"></form>
|
|
132
|
+
<sgds-button type="submit" form="a" formaction="bar" formmethod="get" formtarget="_blank" formnovalidate>
|
|
133
|
+
Submit
|
|
134
|
+
</sgds-button>
|
|
135
|
+
</div>
|
|
136
|
+
`);
|
|
137
|
+
const form = el.querySelector<HTMLFormElement>('form')!;
|
|
138
|
+
const button = el.querySelector<SgdsButton>('sgds-button')!;
|
|
139
|
+
const handleSubmit = sinon.spy((event: SubmitEvent) => {
|
|
140
|
+
submitter = event.submitter as HTMLButtonElement;
|
|
141
|
+
event.preventDefault();
|
|
142
|
+
});
|
|
143
|
+
let submitter!: HTMLButtonElement;
|
|
144
|
+
|
|
145
|
+
form.addEventListener('submit', handleSubmit);
|
|
146
|
+
button.click();
|
|
147
|
+
|
|
148
|
+
expect(handleSubmit).to.have.been.calledOnce;
|
|
149
|
+
expect(submitter.formAction.endsWith('/bar')).to.be.true;
|
|
150
|
+
expect(submitter.formMethod).to.equal('get');
|
|
151
|
+
expect(submitter.formTarget).to.equal('_blank');
|
|
152
|
+
expect(submitter.formNoValidate).to.be.true;
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
describe('when using methods', () => {
|
|
157
|
+
it('should emit sgds-focus and sgds-blur when the button is focused and blurred', async () => {
|
|
158
|
+
const el = await fixture<SgdsButton>(html` <sgds-button>Button</sgds-button> `);
|
|
159
|
+
const focusHandler = sinon.spy();
|
|
160
|
+
const blurHandler = sinon.spy();
|
|
161
|
+
|
|
162
|
+
el.addEventListener('sgds-focus', focusHandler);
|
|
163
|
+
el.addEventListener('sgds-blur', blurHandler);
|
|
164
|
+
|
|
165
|
+
el.focus();
|
|
166
|
+
await waitUntil(() => focusHandler.calledOnce);
|
|
167
|
+
|
|
168
|
+
el.blur();
|
|
169
|
+
await waitUntil(() => blurHandler.calledOnce);
|
|
170
|
+
|
|
171
|
+
expect(focusHandler).to.have.been.calledOnce;
|
|
172
|
+
expect(blurHandler).to.have.been.calledOnce;
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
it('should emit a click event when calling click()', async () => {
|
|
176
|
+
const el = await fixture<SgdsButton>(html` <sgds-button></sgds-button> `);
|
|
177
|
+
const clickHandler = sinon.spy();
|
|
178
|
+
|
|
179
|
+
el.addEventListener('click', clickHandler);
|
|
180
|
+
el.click();
|
|
181
|
+
await waitUntil(() => clickHandler.calledOnce);
|
|
182
|
+
|
|
183
|
+
expect(clickHandler).to.have.been.calledOnce;
|
|
184
|
+
});
|
|
185
|
+
});
|