@spectrum-web-components/button 0.18.0 → 0.18.1

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 (161) hide show
  1. package/README.md +193 -34
  2. package/custom-elements.json +90 -90
  3. package/package.json +50 -16
  4. package/sp-button.dev.js +3 -0
  5. package/sp-button.dev.js.map +7 -0
  6. package/sp-button.js +3 -14
  7. package/sp-button.js.map +7 -1
  8. package/sp-clear-button.dev.js +3 -0
  9. package/sp-clear-button.dev.js.map +7 -0
  10. package/sp-clear-button.js +3 -14
  11. package/sp-clear-button.js.map +7 -1
  12. package/sp-close-button.dev.js +3 -0
  13. package/sp-close-button.dev.js.map +7 -0
  14. package/sp-close-button.js +3 -14
  15. package/sp-close-button.js.map +7 -1
  16. package/src/Button.dev.js +79 -0
  17. package/src/Button.dev.js.map +7 -0
  18. package/src/Button.js +72 -87
  19. package/src/Button.js.map +7 -1
  20. package/src/ButtonBase.dev.js +215 -0
  21. package/src/ButtonBase.dev.js.map +7 -0
  22. package/src/ButtonBase.js +198 -201
  23. package/src/ButtonBase.js.map +7 -1
  24. package/src/ClearButton.dev.js +70 -0
  25. package/src/ClearButton.dev.js.map +7 -0
  26. package/src/ClearButton.js +45 -52
  27. package/src/ClearButton.js.map +7 -1
  28. package/src/CloseButton.dev.js +65 -0
  29. package/src/CloseButton.dev.js.map +7 -0
  30. package/src/CloseButton.js +42 -49
  31. package/src/CloseButton.js.map +7 -1
  32. package/src/StyledButton.dev.js +8 -0
  33. package/src/StyledButton.dev.js.map +7 -0
  34. package/src/StyledButton.js +6 -17
  35. package/src/StyledButton.js.map +7 -1
  36. package/src/button-base.css.dev.js +10 -0
  37. package/src/button-base.css.dev.js.map +7 -0
  38. package/src/button-base.css.js +4 -15
  39. package/src/button-base.css.js.map +7 -1
  40. package/src/button.css.dev.js +619 -0
  41. package/src/button.css.dev.js.map +7 -0
  42. package/src/button.css.js +4 -15
  43. package/src/button.css.js.map +7 -1
  44. package/src/index.dev.js +6 -0
  45. package/src/index.dev.js.map +7 -0
  46. package/src/index.js +6 -17
  47. package/src/index.js.map +7 -1
  48. package/src/spectrum-button-base.css.dev.js +6 -0
  49. package/src/spectrum-button-base.css.dev.js.map +7 -0
  50. package/src/spectrum-button-base.css.js +3 -14
  51. package/src/spectrum-button-base.css.js.map +7 -1
  52. package/src/spectrum-button.css.dev.js +587 -0
  53. package/src/spectrum-button.css.dev.js.map +7 -0
  54. package/src/spectrum-button.css.js +4 -15
  55. package/src/spectrum-button.css.js.map +7 -1
  56. package/stories/button-accent-fill-sizes.stories.js +21 -18
  57. package/stories/button-accent-fill-sizes.stories.js.map +7 -1
  58. package/stories/button-accent-fill.stories.js +24 -20
  59. package/stories/button-accent-fill.stories.js.map +7 -1
  60. package/stories/button-accent-outline-sizes.stories.js +21 -18
  61. package/stories/button-accent-outline-sizes.stories.js.map +7 -1
  62. package/stories/button-accent-outline.stories.js +24 -20
  63. package/stories/button-accent-outline.stories.js.map +7 -1
  64. package/stories/button-black-fill-sizes.stories.js +22 -19
  65. package/stories/button-black-fill-sizes.stories.js.map +7 -1
  66. package/stories/button-black-fill.stories.js +26 -21
  67. package/stories/button-black-fill.stories.js.map +7 -1
  68. package/stories/button-black-outline-sizes.stories.js +22 -19
  69. package/stories/button-black-outline-sizes.stories.js.map +7 -1
  70. package/stories/button-black-outline.stories.js +26 -21
  71. package/stories/button-black-outline.stories.js.map +7 -1
  72. package/stories/button-negative-fill-sizes.stories.js +21 -18
  73. package/stories/button-negative-fill-sizes.stories.js.map +7 -1
  74. package/stories/button-negative-fill.stories.js +24 -20
  75. package/stories/button-negative-fill.stories.js.map +7 -1
  76. package/stories/button-negative-outline-sizes.stories.js +21 -18
  77. package/stories/button-negative-outline-sizes.stories.js.map +7 -1
  78. package/stories/button-negative-outline.stories.js +24 -20
  79. package/stories/button-negative-outline.stories.js.map +7 -1
  80. package/stories/button-primary-fill-sizes.stories.js +21 -18
  81. package/stories/button-primary-fill-sizes.stories.js.map +7 -1
  82. package/stories/button-primary-fill.stories.js +24 -20
  83. package/stories/button-primary-fill.stories.js.map +7 -1
  84. package/stories/button-primary-outline-sizes.stories.js +21 -18
  85. package/stories/button-primary-outline-sizes.stories.js.map +7 -1
  86. package/stories/button-primary-outline.stories.js +24 -20
  87. package/stories/button-primary-outline.stories.js.map +7 -1
  88. package/stories/button-secondary-fill-sizes.stories.js +21 -18
  89. package/stories/button-secondary-fill-sizes.stories.js.map +7 -1
  90. package/stories/button-secondary-fill.stories.js +24 -20
  91. package/stories/button-secondary-fill.stories.js.map +7 -1
  92. package/stories/button-secondary-outline-sizes.stories.js +21 -18
  93. package/stories/button-secondary-outline-sizes.stories.js.map +7 -1
  94. package/stories/button-secondary-outline.stories.js +24 -20
  95. package/stories/button-secondary-outline.stories.js.map +7 -1
  96. package/stories/button-white-fill-sizes.stories.js +22 -19
  97. package/stories/button-white-fill-sizes.stories.js.map +7 -1
  98. package/stories/button-white-fill.stories.js +26 -21
  99. package/stories/button-white-fill.stories.js.map +7 -1
  100. package/stories/button-white-outline-sizes.stories.js +22 -19
  101. package/stories/button-white-outline-sizes.stories.js.map +7 -1
  102. package/stories/button-white-outline.stories.js +26 -21
  103. package/stories/button-white-outline.stories.js.map +7 -1
  104. package/stories/index.js +92 -93
  105. package/stories/index.js.map +7 -1
  106. package/test/benchmark/test-basic.js +5 -16
  107. package/test/benchmark/test-basic.js.map +7 -1
  108. package/test/button-accent-fill-sizes.test-vrt.js +4 -15
  109. package/test/button-accent-fill-sizes.test-vrt.js.map +7 -1
  110. package/test/button-accent-fill.test-vrt.js +4 -15
  111. package/test/button-accent-fill.test-vrt.js.map +7 -1
  112. package/test/button-accent-outline-sizes.test-vrt.js +4 -15
  113. package/test/button-accent-outline-sizes.test-vrt.js.map +7 -1
  114. package/test/button-accent-outline.test-vrt.js +4 -15
  115. package/test/button-accent-outline.test-vrt.js.map +7 -1
  116. package/test/button-black-fill-sizes.test-vrt.js +4 -15
  117. package/test/button-black-fill-sizes.test-vrt.js.map +7 -1
  118. package/test/button-black-fill.test-vrt.js +4 -15
  119. package/test/button-black-fill.test-vrt.js.map +7 -1
  120. package/test/button-black-outline-sizes.test-vrt.js +4 -15
  121. package/test/button-black-outline-sizes.test-vrt.js.map +7 -1
  122. package/test/button-black-outline.test-vrt.js +4 -15
  123. package/test/button-black-outline.test-vrt.js.map +7 -1
  124. package/test/button-negative-fill-sizes.test-vrt.js +4 -15
  125. package/test/button-negative-fill-sizes.test-vrt.js.map +7 -1
  126. package/test/button-negative-fill.test-vrt.js +4 -15
  127. package/test/button-negative-fill.test-vrt.js.map +7 -1
  128. package/test/button-negative-outline-sizes.test-vrt.js +4 -15
  129. package/test/button-negative-outline-sizes.test-vrt.js.map +7 -1
  130. package/test/button-negative-outline.test-vrt.js +4 -15
  131. package/test/button-negative-outline.test-vrt.js.map +7 -1
  132. package/test/button-primary-fill-sizes.test-vrt.js +4 -15
  133. package/test/button-primary-fill-sizes.test-vrt.js.map +7 -1
  134. package/test/button-primary-fill.test-vrt.js +4 -15
  135. package/test/button-primary-fill.test-vrt.js.map +7 -1
  136. package/test/button-primary-outline-sizes.test-vrt.js +4 -15
  137. package/test/button-primary-outline-sizes.test-vrt.js.map +7 -1
  138. package/test/button-primary-outline.test-vrt.js +4 -15
  139. package/test/button-primary-outline.test-vrt.js.map +7 -1
  140. package/test/button-secondary-fill-sizes.test-vrt.js +4 -15
  141. package/test/button-secondary-fill-sizes.test-vrt.js.map +7 -1
  142. package/test/button-secondary-fill.test-vrt.js +4 -15
  143. package/test/button-secondary-fill.test-vrt.js.map +7 -1
  144. package/test/button-secondary-outline-sizes.test-vrt.js +4 -15
  145. package/test/button-secondary-outline-sizes.test-vrt.js.map +7 -1
  146. package/test/button-secondary-outline.test-vrt.js +4 -15
  147. package/test/button-secondary-outline.test-vrt.js.map +7 -1
  148. package/test/button-white-fill-sizes.test-vrt.js +4 -15
  149. package/test/button-white-fill-sizes.test-vrt.js.map +7 -1
  150. package/test/button-white-fill.test-vrt.js +4 -15
  151. package/test/button-white-fill.test-vrt.js.map +7 -1
  152. package/test/button-white-outline-sizes.test-vrt.js +4 -15
  153. package/test/button-white-outline-sizes.test-vrt.js.map +7 -1
  154. package/test/button-white-outline.test-vrt.js +4 -15
  155. package/test/button-white-outline.test-vrt.js.map +7 -1
  156. package/test/button.test.js +321 -320
  157. package/test/button.test.js.map +7 -1
  158. package/test/clear-button.test.js +13 -20
  159. package/test/clear-button.test.js.map +7 -1
  160. package/test/close-button.test.js +13 -20
  161. package/test/close-button.test.js.map +7 -1
@@ -0,0 +1,215 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __decorateClass = (decorators, target, key, kind) => {
4
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
5
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
6
+ if (decorator = decorators[i])
7
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
8
+ if (kind && result)
9
+ __defProp(target, key, result);
10
+ return result;
11
+ };
12
+ import {
13
+ html
14
+ } from "@spectrum-web-components/base";
15
+ import {
16
+ property,
17
+ query
18
+ } from "@spectrum-web-components/base/src/decorators.js";
19
+ import { LikeAnchor } from "@spectrum-web-components/shared/src/like-anchor.js";
20
+ import { Focusable } from "@spectrum-web-components/shared/src/focusable.js";
21
+ import {
22
+ ObserveSlotPresence,
23
+ ObserveSlotText
24
+ } from "@spectrum-web-components/shared";
25
+ export class ButtonBase extends LikeAnchor(ObserveSlotText(ObserveSlotPresence(Focusable, '[slot="icon"]'))) {
26
+ constructor() {
27
+ super();
28
+ this.active = false;
29
+ this.type = "button";
30
+ this.proxyFocus = this.proxyFocus.bind(this);
31
+ this.addEventListener("click", this.handleClickCapture, {
32
+ capture: true
33
+ });
34
+ }
35
+ get hasIcon() {
36
+ return this.slotContentIsPresent;
37
+ }
38
+ get hasLabel() {
39
+ return this.slotHasContent;
40
+ }
41
+ get focusElement() {
42
+ return this;
43
+ }
44
+ get buttonContent() {
45
+ const content = [
46
+ html`
47
+ <div id="label" ?hidden=${!this.hasLabel}>
48
+ <slot
49
+ id="slot"
50
+ @slotchange=${this.manageTextObservedSlot}
51
+ ></slot>
52
+ </div>
53
+ `
54
+ ];
55
+ if (this.hasIcon) {
56
+ content.unshift(html`
57
+ <slot name="icon" ?icon-only=${!this.hasLabel}></slot>
58
+ `);
59
+ }
60
+ return content;
61
+ }
62
+ click() {
63
+ if (this.disabled) {
64
+ return;
65
+ }
66
+ if (this.shouldProxyClick()) {
67
+ return;
68
+ }
69
+ super.click();
70
+ }
71
+ handleClickCapture(event) {
72
+ if (this.disabled) {
73
+ event.preventDefault();
74
+ event.stopImmediatePropagation();
75
+ event.stopPropagation();
76
+ return false;
77
+ }
78
+ }
79
+ proxyFocus() {
80
+ this.focus();
81
+ }
82
+ shouldProxyClick() {
83
+ let handled = false;
84
+ if (this.anchorElement) {
85
+ this.anchorElement.click();
86
+ handled = true;
87
+ } else if (this.type !== "button") {
88
+ const proxy = document.createElement("button");
89
+ proxy.type = this.type;
90
+ this.insertAdjacentElement("afterend", proxy);
91
+ proxy.click();
92
+ proxy.remove();
93
+ handled = true;
94
+ }
95
+ return handled;
96
+ }
97
+ renderAnchor() {
98
+ return html`
99
+ ${this.buttonContent}
100
+ ${super.renderAnchor({
101
+ id: "button",
102
+ ariaHidden: true,
103
+ className: "button anchor hidden"
104
+ })}
105
+ `;
106
+ }
107
+ renderButton() {
108
+ return html`
109
+ ${this.buttonContent}
110
+ `;
111
+ }
112
+ render() {
113
+ return this.href && this.href.length > 0 ? this.renderAnchor() : this.renderButton();
114
+ }
115
+ handleKeydown(event) {
116
+ const { code } = event;
117
+ switch (code) {
118
+ case "Space":
119
+ event.preventDefault();
120
+ if (typeof this.href === "undefined") {
121
+ this.addEventListener("keyup", this.handleKeyup);
122
+ this.active = true;
123
+ }
124
+ break;
125
+ default:
126
+ break;
127
+ }
128
+ }
129
+ handleKeypress(event) {
130
+ const { code } = event;
131
+ switch (code) {
132
+ case "Enter":
133
+ case "NumpadEnter":
134
+ this.click();
135
+ break;
136
+ default:
137
+ break;
138
+ }
139
+ }
140
+ handleKeyup(event) {
141
+ const { code } = event;
142
+ switch (code) {
143
+ case "Space":
144
+ this.removeEventListener("keyup", this.handleKeyup);
145
+ this.active = false;
146
+ this.click();
147
+ break;
148
+ default:
149
+ break;
150
+ }
151
+ }
152
+ handleRemoveActive() {
153
+ this.active = false;
154
+ }
155
+ handlePointerdown() {
156
+ this.active = true;
157
+ }
158
+ manageAnchor() {
159
+ if (this.href && this.href.length > 0) {
160
+ if (this.getAttribute("role") === "button") {
161
+ this.setAttribute("role", "link");
162
+ }
163
+ this.removeEventListener("click", this.shouldProxyClick);
164
+ } else {
165
+ if (!this.hasAttribute("role") || this.getAttribute("role") === "link") {
166
+ this.setAttribute("role", "button");
167
+ }
168
+ this.addEventListener("click", this.shouldProxyClick);
169
+ }
170
+ }
171
+ firstUpdated(changed) {
172
+ super.firstUpdated(changed);
173
+ if (!this.hasAttribute("tabindex")) {
174
+ this.tabIndex = 0;
175
+ }
176
+ this.manageAnchor();
177
+ this.addEventListener("keydown", this.handleKeydown);
178
+ this.addEventListener("keypress", this.handleKeypress);
179
+ this.addEventListener("pointerdown", this.handlePointerdown);
180
+ }
181
+ updated(changed) {
182
+ super.updated(changed);
183
+ if (changed.has("href")) {
184
+ this.manageAnchor();
185
+ }
186
+ if (changed.has("label")) {
187
+ this.setAttribute("aria-label", this.label || "");
188
+ }
189
+ if (changed.has("active")) {
190
+ if (this.active) {
191
+ this.addEventListener("focusout", this.handleRemoveActive);
192
+ this.addEventListener("pointerup", this.handleRemoveActive);
193
+ this.addEventListener("pointerleave", this.handleRemoveActive);
194
+ } else {
195
+ this.removeEventListener("focusout", this.handleRemoveActive);
196
+ this.removeEventListener("pointerup", this.handleRemoveActive);
197
+ this.removeEventListener("pointerleave", this.handleRemoveActive);
198
+ }
199
+ }
200
+ if (this.anchorElement) {
201
+ this.anchorElement.addEventListener("focus", this.proxyFocus);
202
+ this.anchorElement.tabIndex = -1;
203
+ }
204
+ }
205
+ }
206
+ __decorateClass([
207
+ property({ type: Boolean, reflect: true })
208
+ ], ButtonBase.prototype, "active", 2);
209
+ __decorateClass([
210
+ property({ type: String })
211
+ ], ButtonBase.prototype, "type", 2);
212
+ __decorateClass([
213
+ query(".anchor")
214
+ ], ButtonBase.prototype, "anchorElement", 2);
215
+ //# sourceMappingURL=ButtonBase.dev.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["ButtonBase.ts"],
4
+ "sourcesContent": ["/*\nCopyright 2020 Adobe. All rights reserved.\nThis file is licensed to you under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License. You may obtain a copy\nof the License at http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under\nthe License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\nOF ANY KIND, either express or implied. See the License for the specific language\ngoverning permissions and limitations under the License.\n*/\n\nimport {\n html,\n PropertyValues,\n TemplateResult,\n} from '@spectrum-web-components/base';\nimport {\n property,\n query,\n} from '@spectrum-web-components/base/src/decorators.js';\nimport { LikeAnchor } from '@spectrum-web-components/shared/src/like-anchor.js';\nimport { Focusable } from '@spectrum-web-components/shared/src/focusable.js';\nimport {\n ObserveSlotPresence,\n ObserveSlotText,\n} from '@spectrum-web-components/shared';\n\n/**\n * @slot - text content to be displayed in the Button element\n * @slot icon - icon element(s) to display at the start of the button\n */\nexport class ButtonBase extends LikeAnchor(\n ObserveSlotText(ObserveSlotPresence(Focusable, '[slot=\"icon\"]'))\n) {\n protected get hasIcon(): boolean {\n return this.slotContentIsPresent;\n }\n\n @property({ type: Boolean, reflect: true })\n public active = false;\n\n @property({ type: String })\n public type: 'button' | 'submit' | 'reset' = 'button';\n\n protected get hasLabel(): boolean {\n return this.slotHasContent;\n }\n\n @query('.anchor')\n private anchorElement!: HTMLButtonElement;\n\n public override get focusElement(): HTMLElement {\n return this;\n }\n\n protected get buttonContent(): TemplateResult[] {\n const content = [\n html`\n <div id=\"label\" ?hidden=${!this.hasLabel}>\n <slot\n id=\"slot\"\n @slotchange=${this.manageTextObservedSlot}\n ></slot>\n </div>\n `,\n ];\n if (this.hasIcon) {\n content.unshift(html`\n <slot name=\"icon\" ?icon-only=${!this.hasLabel}></slot>\n `);\n }\n return content;\n }\n\n constructor() {\n super();\n this.proxyFocus = this.proxyFocus.bind(this);\n\n this.addEventListener('click', this.handleClickCapture, {\n capture: true,\n });\n }\n\n public override click(): void {\n if (this.disabled) {\n return;\n }\n\n if (this.shouldProxyClick()) {\n return;\n }\n\n super.click();\n }\n\n private handleClickCapture(event: Event): void | boolean {\n if (this.disabled) {\n event.preventDefault();\n event.stopImmediatePropagation();\n event.stopPropagation();\n return false;\n }\n }\n\n private proxyFocus(): void {\n this.focus();\n }\n\n private shouldProxyClick(): boolean {\n let handled = false;\n if (this.anchorElement) {\n this.anchorElement.click();\n handled = true;\n } else if (this.type !== 'button') {\n const proxy = document.createElement('button');\n proxy.type = this.type;\n this.insertAdjacentElement('afterend', proxy);\n proxy.click();\n proxy.remove();\n handled = true;\n }\n return handled;\n }\n\n public override renderAnchor(): TemplateResult {\n return html`\n ${this.buttonContent}\n ${super.renderAnchor({\n id: 'button',\n ariaHidden: true,\n className: 'button anchor hidden',\n })}\n `;\n }\n\n protected renderButton(): TemplateResult {\n return html`\n ${this.buttonContent}\n `;\n }\n\n protected override render(): TemplateResult {\n return this.href && this.href.length > 0\n ? this.renderAnchor()\n : this.renderButton();\n }\n\n protected handleKeydown(event: KeyboardEvent): void {\n const { code } = event;\n switch (code) {\n case 'Space':\n event.preventDefault();\n if (typeof this.href === 'undefined') {\n this.addEventListener('keyup', this.handleKeyup);\n this.active = true;\n }\n break;\n default:\n break;\n }\n }\n\n private handleKeypress(event: KeyboardEvent): void {\n const { code } = event;\n switch (code) {\n case 'Enter':\n case 'NumpadEnter':\n this.click();\n break;\n default:\n break;\n }\n }\n\n protected handleKeyup(event: KeyboardEvent): void {\n const { code } = event;\n switch (code) {\n case 'Space':\n this.removeEventListener('keyup', this.handleKeyup);\n this.active = false;\n this.click();\n break;\n default:\n break;\n }\n }\n\n private handleRemoveActive(): void {\n this.active = false;\n }\n\n private handlePointerdown(): void {\n this.active = true;\n }\n\n private manageAnchor(): void {\n if (this.href && this.href.length > 0) {\n if (this.getAttribute('role') === 'button') {\n this.setAttribute('role', 'link');\n }\n this.removeEventListener('click', this.shouldProxyClick);\n } else {\n if (\n !this.hasAttribute('role') ||\n this.getAttribute('role') === 'link'\n ) {\n this.setAttribute('role', 'button');\n }\n this.addEventListener('click', this.shouldProxyClick);\n }\n }\n\n protected override firstUpdated(changed: PropertyValues): void {\n super.firstUpdated(changed);\n if (!this.hasAttribute('tabindex')) {\n this.tabIndex = 0;\n }\n this.manageAnchor();\n this.addEventListener('keydown', this.handleKeydown);\n this.addEventListener('keypress', this.handleKeypress);\n this.addEventListener('pointerdown', this.handlePointerdown);\n }\n\n protected override updated(changed: PropertyValues): void {\n super.updated(changed);\n if (changed.has('href')) {\n this.manageAnchor();\n }\n if (changed.has('label')) {\n this.setAttribute('aria-label', this.label || '');\n }\n if (changed.has('active')) {\n if (this.active) {\n this.addEventListener('focusout', this.handleRemoveActive);\n this.addEventListener('pointerup', this.handleRemoveActive);\n this.addEventListener('pointerleave', this.handleRemoveActive);\n } else {\n this.removeEventListener('focusout', this.handleRemoveActive);\n this.removeEventListener('pointerup', this.handleRemoveActive);\n this.removeEventListener(\n 'pointerleave',\n this.handleRemoveActive\n );\n }\n }\n if (this.anchorElement) {\n this.anchorElement.addEventListener('focus', this.proxyFocus);\n this.anchorElement.tabIndex = -1;\n }\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
package/src/ButtonBase.js CHANGED
@@ -1,218 +1,215 @@
1
- /*
2
- Copyright 2020 Adobe. All rights reserved.
3
- This file is licensed to you under the Apache License, Version 2.0 (the "License");
4
- you may not use this file except in compliance with the License. You may obtain a copy
5
- of the License at http://www.apache.org/licenses/LICENSE-2.0
6
-
7
- Unless required by applicable law or agreed to in writing, software distributed under
8
- the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
9
- OF ANY KIND, either express or implied. See the License for the specific language
10
- governing permissions and limitations under the License.
11
- */
12
- import { __decorate } from "tslib";
13
- import { html, } from '@spectrum-web-components/base';
14
- import { property, query, } from '@spectrum-web-components/base/src/decorators.js';
15
- import { LikeAnchor } from '@spectrum-web-components/shared/src/like-anchor.js';
16
- import { Focusable } from '@spectrum-web-components/shared/src/focusable.js';
17
- import { ObserveSlotPresence, ObserveSlotText, } from '@spectrum-web-components/shared';
18
- /**
19
- * @slot - text content to be displayed in the Button element
20
- * @slot icon - icon element(s) to display at the start of the button
21
- */
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __decorateClass = (decorators, target, key, kind) => {
4
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
5
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
6
+ if (decorator = decorators[i])
7
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
8
+ if (kind && result)
9
+ __defProp(target, key, result);
10
+ return result;
11
+ };
12
+ import {
13
+ html
14
+ } from "@spectrum-web-components/base";
15
+ import {
16
+ property,
17
+ query
18
+ } from "@spectrum-web-components/base/src/decorators.js";
19
+ import { LikeAnchor } from "@spectrum-web-components/shared/src/like-anchor.js";
20
+ import { Focusable } from "@spectrum-web-components/shared/src/focusable.js";
21
+ import {
22
+ ObserveSlotPresence,
23
+ ObserveSlotText
24
+ } from "@spectrum-web-components/shared";
22
25
  export class ButtonBase extends LikeAnchor(ObserveSlotText(ObserveSlotPresence(Focusable, '[slot="icon"]'))) {
23
- constructor() {
24
- super();
25
- this.active = false;
26
- this.type = 'button';
27
- this.proxyFocus = this.proxyFocus.bind(this);
28
- this.addEventListener('click', this.handleClickCapture, {
29
- capture: true,
30
- });
31
- }
32
- get hasIcon() {
33
- return this.slotContentIsPresent;
34
- }
35
- get hasLabel() {
36
- return this.slotHasContent;
37
- }
38
- get focusElement() {
39
- return this;
40
- }
41
- get buttonContent() {
42
- const content = [
43
- html `
26
+ constructor() {
27
+ super();
28
+ this.active = false;
29
+ this.type = "button";
30
+ this.proxyFocus = this.proxyFocus.bind(this);
31
+ this.addEventListener("click", this.handleClickCapture, {
32
+ capture: true
33
+ });
34
+ }
35
+ get hasIcon() {
36
+ return this.slotContentIsPresent;
37
+ }
38
+ get hasLabel() {
39
+ return this.slotHasContent;
40
+ }
41
+ get focusElement() {
42
+ return this;
43
+ }
44
+ get buttonContent() {
45
+ const content = [
46
+ html`
44
47
  <div id="label" ?hidden=${!this.hasLabel}>
45
48
  <slot
46
49
  id="slot"
47
50
  @slotchange=${this.manageTextObservedSlot}
48
51
  ></slot>
49
52
  </div>
50
- `,
51
- ];
52
- if (this.hasIcon) {
53
- content.unshift(html `
53
+ `
54
+ ];
55
+ if (this.hasIcon) {
56
+ content.unshift(html`
54
57
  <slot name="icon" ?icon-only=${!this.hasLabel}></slot>
55
58
  `);
56
- }
57
- return content;
58
- }
59
- click() {
60
- if (this.disabled) {
61
- return;
62
- }
63
- if (this.shouldProxyClick()) {
64
- return;
65
- }
66
- super.click();
67
59
  }
68
- handleClickCapture(event) {
69
- if (this.disabled) {
70
- event.preventDefault();
71
- event.stopImmediatePropagation();
72
- event.stopPropagation();
73
- return false;
74
- }
75
- }
76
- proxyFocus() {
77
- this.focus();
78
- }
79
- shouldProxyClick() {
80
- let handled = false;
81
- if (this.anchorElement) {
82
- this.anchorElement.click();
83
- handled = true;
84
- }
85
- else if (this.type !== 'button') {
86
- const proxy = document.createElement('button');
87
- proxy.type = this.type;
88
- this.insertAdjacentElement('afterend', proxy);
89
- proxy.click();
90
- proxy.remove();
91
- handled = true;
92
- }
93
- return handled;
94
- }
95
- renderAnchor() {
96
- return html `
60
+ return content;
61
+ }
62
+ click() {
63
+ if (this.disabled) {
64
+ return;
65
+ }
66
+ if (this.shouldProxyClick()) {
67
+ return;
68
+ }
69
+ super.click();
70
+ }
71
+ handleClickCapture(event) {
72
+ if (this.disabled) {
73
+ event.preventDefault();
74
+ event.stopImmediatePropagation();
75
+ event.stopPropagation();
76
+ return false;
77
+ }
78
+ }
79
+ proxyFocus() {
80
+ this.focus();
81
+ }
82
+ shouldProxyClick() {
83
+ let handled = false;
84
+ if (this.anchorElement) {
85
+ this.anchorElement.click();
86
+ handled = true;
87
+ } else if (this.type !== "button") {
88
+ const proxy = document.createElement("button");
89
+ proxy.type = this.type;
90
+ this.insertAdjacentElement("afterend", proxy);
91
+ proxy.click();
92
+ proxy.remove();
93
+ handled = true;
94
+ }
95
+ return handled;
96
+ }
97
+ renderAnchor() {
98
+ return html`
97
99
  ${this.buttonContent}
98
100
  ${super.renderAnchor({
99
- id: 'button',
100
- ariaHidden: true,
101
- className: 'button anchor hidden',
102
- })}
101
+ id: "button",
102
+ ariaHidden: true,
103
+ className: "button anchor hidden"
104
+ })}
103
105
  `;
104
- }
105
- renderButton() {
106
- return html `
106
+ }
107
+ renderButton() {
108
+ return html`
107
109
  ${this.buttonContent}
108
110
  `;
109
- }
110
- render() {
111
- return this.href && this.href.length > 0
112
- ? this.renderAnchor()
113
- : this.renderButton();
114
- }
115
- handleKeydown(event) {
116
- const { code } = event;
117
- switch (code) {
118
- case 'Space':
119
- event.preventDefault();
120
- if (typeof this.href === 'undefined') {
121
- this.addEventListener('keyup', this.handleKeyup);
122
- this.active = true;
123
- }
124
- break;
125
- default:
126
- break;
127
- }
128
- }
129
- handleKeypress(event) {
130
- const { code } = event;
131
- switch (code) {
132
- case 'Enter':
133
- case 'NumpadEnter':
134
- this.click();
135
- break;
136
- default:
137
- break;
138
- }
139
- }
140
- handleKeyup(event) {
141
- const { code } = event;
142
- switch (code) {
143
- case 'Space':
144
- this.removeEventListener('keyup', this.handleKeyup);
145
- this.active = false;
146
- this.click();
147
- break;
148
- default:
149
- break;
150
- }
151
- }
152
- handleRemoveActive() {
111
+ }
112
+ render() {
113
+ return this.href && this.href.length > 0 ? this.renderAnchor() : this.renderButton();
114
+ }
115
+ handleKeydown(event) {
116
+ const { code } = event;
117
+ switch (code) {
118
+ case "Space":
119
+ event.preventDefault();
120
+ if (typeof this.href === "undefined") {
121
+ this.addEventListener("keyup", this.handleKeyup);
122
+ this.active = true;
123
+ }
124
+ break;
125
+ default:
126
+ break;
127
+ }
128
+ }
129
+ handleKeypress(event) {
130
+ const { code } = event;
131
+ switch (code) {
132
+ case "Enter":
133
+ case "NumpadEnter":
134
+ this.click();
135
+ break;
136
+ default:
137
+ break;
138
+ }
139
+ }
140
+ handleKeyup(event) {
141
+ const { code } = event;
142
+ switch (code) {
143
+ case "Space":
144
+ this.removeEventListener("keyup", this.handleKeyup);
153
145
  this.active = false;
154
- }
155
- handlePointerdown() {
156
- this.active = true;
157
- }
158
- manageAnchor() {
159
- if (this.href && this.href.length > 0) {
160
- if (this.getAttribute('role') === 'button') {
161
- this.setAttribute('role', 'link');
162
- }
163
- this.removeEventListener('click', this.shouldProxyClick);
164
- }
165
- else {
166
- if (!this.hasAttribute('role') ||
167
- this.getAttribute('role') === 'link') {
168
- this.setAttribute('role', 'button');
169
- }
170
- this.addEventListener('click', this.shouldProxyClick);
171
- }
172
- }
173
- firstUpdated(changed) {
174
- super.firstUpdated(changed);
175
- if (!this.hasAttribute('tabindex')) {
176
- this.tabIndex = 0;
177
- }
178
- this.manageAnchor();
179
- this.addEventListener('keydown', this.handleKeydown);
180
- this.addEventListener('keypress', this.handleKeypress);
181
- this.addEventListener('pointerdown', this.handlePointerdown);
182
- }
183
- updated(changed) {
184
- super.updated(changed);
185
- if (changed.has('href')) {
186
- this.manageAnchor();
187
- }
188
- if (changed.has('label')) {
189
- this.setAttribute('aria-label', this.label || '');
190
- }
191
- if (changed.has('active')) {
192
- if (this.active) {
193
- this.addEventListener('focusout', this.handleRemoveActive);
194
- this.addEventListener('pointerup', this.handleRemoveActive);
195
- this.addEventListener('pointerleave', this.handleRemoveActive);
196
- }
197
- else {
198
- this.removeEventListener('focusout', this.handleRemoveActive);
199
- this.removeEventListener('pointerup', this.handleRemoveActive);
200
- this.removeEventListener('pointerleave', this.handleRemoveActive);
201
- }
202
- }
203
- if (this.anchorElement) {
204
- this.anchorElement.addEventListener('focus', this.proxyFocus);
205
- this.anchorElement.tabIndex = -1;
206
- }
207
- }
146
+ this.click();
147
+ break;
148
+ default:
149
+ break;
150
+ }
151
+ }
152
+ handleRemoveActive() {
153
+ this.active = false;
154
+ }
155
+ handlePointerdown() {
156
+ this.active = true;
157
+ }
158
+ manageAnchor() {
159
+ if (this.href && this.href.length > 0) {
160
+ if (this.getAttribute("role") === "button") {
161
+ this.setAttribute("role", "link");
162
+ }
163
+ this.removeEventListener("click", this.shouldProxyClick);
164
+ } else {
165
+ if (!this.hasAttribute("role") || this.getAttribute("role") === "link") {
166
+ this.setAttribute("role", "button");
167
+ }
168
+ this.addEventListener("click", this.shouldProxyClick);
169
+ }
170
+ }
171
+ firstUpdated(changed) {
172
+ super.firstUpdated(changed);
173
+ if (!this.hasAttribute("tabindex")) {
174
+ this.tabIndex = 0;
175
+ }
176
+ this.manageAnchor();
177
+ this.addEventListener("keydown", this.handleKeydown);
178
+ this.addEventListener("keypress", this.handleKeypress);
179
+ this.addEventListener("pointerdown", this.handlePointerdown);
180
+ }
181
+ updated(changed) {
182
+ super.updated(changed);
183
+ if (changed.has("href")) {
184
+ this.manageAnchor();
185
+ }
186
+ if (changed.has("label")) {
187
+ this.setAttribute("aria-label", this.label || "");
188
+ }
189
+ if (changed.has("active")) {
190
+ if (this.active) {
191
+ this.addEventListener("focusout", this.handleRemoveActive);
192
+ this.addEventListener("pointerup", this.handleRemoveActive);
193
+ this.addEventListener("pointerleave", this.handleRemoveActive);
194
+ } else {
195
+ this.removeEventListener("focusout", this.handleRemoveActive);
196
+ this.removeEventListener("pointerup", this.handleRemoveActive);
197
+ this.removeEventListener("pointerleave", this.handleRemoveActive);
198
+ }
199
+ }
200
+ if (this.anchorElement) {
201
+ this.anchorElement.addEventListener("focus", this.proxyFocus);
202
+ this.anchorElement.tabIndex = -1;
203
+ }
204
+ }
208
205
  }
209
- __decorate([
210
- property({ type: Boolean, reflect: true })
211
- ], ButtonBase.prototype, "active", void 0);
212
- __decorate([
213
- property({ type: String })
214
- ], ButtonBase.prototype, "type", void 0);
215
- __decorate([
216
- query('.anchor')
217
- ], ButtonBase.prototype, "anchorElement", void 0);
218
- //# sourceMappingURL=ButtonBase.js.map
206
+ __decorateClass([
207
+ property({ type: Boolean, reflect: true })
208
+ ], ButtonBase.prototype, "active", 2);
209
+ __decorateClass([
210
+ property({ type: String })
211
+ ], ButtonBase.prototype, "type", 2);
212
+ __decorateClass([
213
+ query(".anchor")
214
+ ], ButtonBase.prototype, "anchorElement", 2);
215
+ //# sourceMappingURL=ButtonBase.js.map