diff --git a/custom-elements-manifest.js b/custom-elements-manifest.js
index f60557583..03e3f5ab5 100644
--- a/custom-elements-manifest.js
+++ b/custom-elements-manifest.js
@@ -9,10 +9,6 @@ const packageData = JSON.parse(fs.readFileSync('./package.json', 'utf8'));
const { name, description, version, author, homepage, license } = packageData;
const outdir = 'dist';
-function noDash(string) {
- return string.replace(/^\s?-/, '').trim();
-}
-
function replace(string, terms) {
terms.forEach(({ from, to }) => {
string = string?.replace(from, to);
@@ -106,6 +102,7 @@ export default {
if (classDoc?.events) {
classDoc.events.forEach(event => {
+ if (!event.name) return;
event.reactName = `on${pascalCase(event.name)}`;
event.eventName = `${pascalCase(event.name)}Event`;
});
@@ -174,12 +171,15 @@ export default {
url: `https://shoelace.style/components/${tag.replace('wa-', '')}`
};
}
- }),
-
- customElementVuejsPlugin({
- outdir: './dist/types/vue',
- fileName: 'index.d.ts',
- componentTypePath: (_, tag) => `../../components/${tag.replace('wa-', '')}/${tag.replace('wa-', '')}.js`
})
+
+ //
+ // TODO - figure out why this broke when events were updated
+ //
+ // customElementVuejsPlugin({
+ // outdir: './dist/types/vue',
+ // fileName: 'index.d.ts',
+ // componentTypePath: (_, tag) => `../../components/${tag.replace('wa-', '')}/${tag.replace('wa-', '')}.js`
+ // })
]
};
diff --git a/docs/_layouts/component.njk b/docs/_layouts/component.njk
index 045f4515e..2df14c5d0 100644
--- a/docs/_layouts/component.njk
+++ b/docs/_layouts/component.njk
@@ -184,10 +184,12 @@
{% for event in component.events %}
-
- {{ event.name }} |
- {{ event.description | inlineMarkdown | safe }} |
-
+ {% if event.name %}
+
+ {{ event.name }} |
+ {{ event.description | inlineMarkdown | safe }} |
+
+ {% endif %}
{% endfor %}
diff --git a/scripts/shared.js b/scripts/shared.js
index dcdba6e58..c1614b925 100644
--- a/scripts/shared.js
+++ b/scripts/shared.js
@@ -9,6 +9,14 @@ export function getAllComponents(metadata) {
const path = module.path;
if (component) {
+ // Calling `new Event()` adds a blank entry into the CEM, so we'll filter them out here
+ if (component.events) {
+ component.events = component.events.filter(event => {
+ return event.name ? true : false;
+ });
+ }
+
+ // component.events = component.events.filter(event => !!event.name);
allComponents.push(Object.assign(component, { path }));
}
}
diff --git a/src/components/animated-image/animated-image.ts b/src/components/animated-image/animated-image.ts
index d1aab1df4..f6531e876 100644
--- a/src/components/animated-image/animated-image.ts
+++ b/src/components/animated-image/animated-image.ts
@@ -1,6 +1,8 @@
import '../icon/icon.js';
import { customElement, property, query, state } from 'lit/decorators.js';
import { html } from 'lit';
+import { WaErrorEvent } from '../../events/error.js';
+import { WaLoadEvent } from '../../events/load.js';
import { watch } from '../../internal/watch.js';
import componentStyles from '../../styles/component.styles.js';
import styles from './animated-image.styles.js';
@@ -57,13 +59,13 @@ export default class WaAnimatedImage extends WebAwesomeElement {
this.frozenFrame = canvas.toDataURL('image/gif');
if (!this.isLoaded) {
- this.emit('wa-load');
+ this.dispatchEvent(new WaLoadEvent());
this.isLoaded = true;
}
}
private handleError() {
- this.emit('wa-error');
+ this.dispatchEvent(new WaErrorEvent());
}
@watch('play', { waitUntilFirstUpdate: true })
diff --git a/src/components/animation/animation.ts b/src/components/animation/animation.ts
index c6fea2e85..eb63fdb84 100644
--- a/src/components/animation/animation.ts
+++ b/src/components/animation/animation.ts
@@ -1,6 +1,9 @@
import { animations } from './animations.js';
import { customElement, property, queryAsync } from 'lit/decorators.js';
import { html } from 'lit';
+import { WaCancelEvent } from '../../events/cancel.js';
+import { WaFinishEvent } from '../../events/finish.js';
+import { WaStartEvent } from '../../events/start.js';
import { watch } from '../../internal/watch.js';
import componentStyles from '../../styles/component.styles.js';
import styles from './animation.styles.js';
@@ -102,13 +105,13 @@ export default class WaAnimation extends WebAwesomeElement {
private handleAnimationFinish = () => {
this.play = false;
this.hasStarted = false;
- this.emit('wa-finish');
+ this.dispatchEvent(new WaFinishEvent());
};
private handleAnimationCancel = () => {
this.play = false;
this.hasStarted = false;
- this.emit('wa-cancel');
+ this.dispatchEvent(new WaCancelEvent());
};
private handleSlotChange() {
@@ -143,7 +146,7 @@ export default class WaAnimation extends WebAwesomeElement {
if (this.play) {
this.hasStarted = true;
- this.emit('wa-start');
+ this.dispatchEvent(new WaStartEvent());
} else {
this.animation.pause();
}
@@ -185,7 +188,7 @@ export default class WaAnimation extends WebAwesomeElement {
if (this.animation) {
if (this.play && !this.hasStarted) {
this.hasStarted = true;
- this.emit('wa-start');
+ this.dispatchEvent(new WaStartEvent());
}
if (this.play) {
diff --git a/src/components/button/button.ts b/src/components/button/button.ts
index 85ea6a3c2..53f77b8e4 100644
--- a/src/components/button/button.ts
+++ b/src/components/button/button.ts
@@ -6,6 +6,9 @@ import { html, literal } from 'lit/static-html.js';
import { ifDefined } from 'lit/directives/if-defined.js';
import { LocalizeController } from '../../utilities/localize.js';
import { MirrorValidator } from '../../internal/validators/mirror-validator.js';
+import { WaBlurEvent } from '../../events/blur.js';
+import { WaFocusEvent } from '../../events/focus.js';
+import { WaInvalidEvent } from '../../events/invalid.js';
import { watch } from '../../internal/watch.js';
import { WebAwesomeFormAssociatedElement } from '../../internal/webawesome-element.js';
import componentStyles from '../../styles/component.styles.js';
@@ -148,12 +151,12 @@ export default class WaButton extends WebAwesomeFormAssociatedElement {
private handleBlur() {
this.hasFocus = false;
- this.emit('wa-blur');
+ this.dispatchEvent(new WaBlurEvent());
}
private handleFocus() {
this.hasFocus = true;
- this.emit('wa-focus');
+ this.dispatchEvent(new WaFocusEvent());
}
private handleClick() {
@@ -193,7 +196,7 @@ export default class WaButton extends WebAwesomeFormAssociatedElement {
}
private handleInvalid() {
- this.emit('wa-invalid');
+ this.dispatchEvent(new WaInvalidEvent());
}
private isButton() {
diff --git a/src/components/carousel/carousel.ts b/src/components/carousel/carousel.ts
index 2671b4c74..64f219464 100644
--- a/src/components/carousel/carousel.ts
+++ b/src/components/carousel/carousel.ts
@@ -11,6 +11,7 @@ import { map } from 'lit/directives/map.js';
import { prefersReducedMotion } from '../../internal/animate.js';
import { range } from 'lit/directives/range.js';
import { waitForEvent } from '../../internal/event.js';
+import { WaSlideChangeEvent } from '../../events/slide-change.js';
import { watch } from '../../internal/watch.js';
import componentStyles from '../../styles/component.styles.js';
import styles from './carousel.styles.js';
@@ -387,12 +388,12 @@ export default class WaCarousel extends WebAwesomeElement {
// Do not emit an event on first render
if (this.hasUpdated) {
- this.emit('wa-slide-change', {
- detail: {
+ this.dispatchEvent(
+ new WaSlideChangeEvent({
index: this.activeSlide,
slide: slides[this.activeSlide]
- }
- });
+ })
+ );
}
}
diff --git a/src/components/checkbox/checkbox.ts b/src/components/checkbox/checkbox.ts
index a4422c218..b359ad517 100644
--- a/src/components/checkbox/checkbox.ts
+++ b/src/components/checkbox/checkbox.ts
@@ -6,6 +6,10 @@ import { html } from 'lit';
import { ifDefined } from 'lit/directives/if-defined.js';
import { live } from 'lit/directives/live.js';
import { RequiredValidator } from '../../internal/validators/required-validator.js';
+import { WaBlurEvent } from '../../events/blur.js';
+import { WaChangeEvent } from '../../events/change.js';
+import { WaFocusEvent } from '../../events/focus.js';
+import { WaInputEvent } from '../../events/input.js';
import { watch } from '../../internal/watch.js';
import { WebAwesomeFormAssociatedElement } from '../../internal/webawesome-element.js';
import componentStyles from '../../styles/component.styles.js';
@@ -113,21 +117,21 @@ export default class WaCheckbox extends WebAwesomeFormAssociatedElement {
private handleClick() {
this.checked = !this.checked;
this.indeterminate = false;
- this.emit('wa-change');
+ this.dispatchEvent(new WaChangeEvent());
}
private handleBlur() {
this.hasFocus = false;
- this.emit('wa-blur');
+ this.dispatchEvent(new WaBlurEvent());
}
private handleInput() {
- this.emit('wa-input');
+ this.dispatchEvent(new WaInputEvent());
}
private handleFocus() {
this.hasFocus = true;
- this.emit('wa-focus');
+ this.dispatchEvent(new WaFocusEvent());
}
@watch('defaultChecked')
diff --git a/src/components/color-picker/color-picker.ts b/src/components/color-picker/color-picker.ts
index f54a08902..e3cdf6e57 100644
--- a/src/components/color-picker/color-picker.ts
+++ b/src/components/color-picker/color-picker.ts
@@ -14,13 +14,16 @@ import { LocalizeController } from '../../utilities/localize.js';
import { RequiredValidator } from '../../internal/validators/required-validator.js';
import { styleMap } from 'lit/directives/style-map.js';
import { TinyColor } from '@ctrl/tinycolor';
+import { WaBlurEvent } from '../../events/blur.js';
+import { WaChangeEvent } from '../../events/change.js';
+import { WaFocusEvent } from '../../events/focus.js';
+import { WaInputEvent } from '../../events/input.js';
+import { WaInvalidEvent } from '../../events/invalid.js';
import { watch } from '../../internal/watch.js';
import { WebAwesomeFormAssociatedElement } from '../../internal/webawesome-element.js';
import componentStyles from '../../styles/component.styles.js';
import styles from './color-picker.styles.js';
import type { CSSResultGroup } from 'lit';
-import type { WaChangeEvent } from '../../events/wa-change.js';
-import type { WaInputEvent } from '../../events/wa-input.js';
import type WaDropdown from '../dropdown/dropdown.js';
import type WaInput from '../input/input.js';
@@ -218,12 +221,12 @@ export default class WaColorPicker extends WebAwesomeFormAssociatedElement {
private handleFocusIn = () => {
this.hasFocus = true;
- this.emit('wa-focus');
+ this.dispatchEvent(new WaFocusEvent());
};
private handleFocusOut = () => {
this.hasFocus = false;
- this.emit('wa-blur');
+ this.dispatchEvent(new WaBlurEvent());
};
private handleFormatToggle() {
@@ -231,8 +234,8 @@ export default class WaColorPicker extends WebAwesomeFormAssociatedElement {
const nextIndex = (formats.indexOf(this.format) + 1) % formats.length;
this.format = formats[nextIndex] as 'hex' | 'rgb' | 'hsl' | 'hsv';
this.setColor(this.value);
- this.emit('wa-change');
- this.emit('wa-input');
+ this.dispatchEvent(new WaChangeEvent());
+ this.dispatchEvent(new WaInputEvent());
}
private handleAlphaDrag(event: PointerEvent) {
@@ -252,13 +255,13 @@ export default class WaColorPicker extends WebAwesomeFormAssociatedElement {
if (this.value !== currentValue) {
currentValue = this.value;
- this.emit('wa-input');
+ this.dispatchEvent(new WaInputEvent());
}
},
onStop: () => {
if (this.value !== initialValue) {
initialValue = this.value;
- this.emit('wa-change');
+ this.dispatchEvent(new WaChangeEvent());
}
},
initialEvent: event
@@ -282,13 +285,13 @@ export default class WaColorPicker extends WebAwesomeFormAssociatedElement {
if (this.value !== currentValue) {
currentValue = this.value;
- this.emit('wa-input');
+ this.dispatchEvent(new WaInputEvent());
}
},
onStop: () => {
if (this.value !== initialValue) {
initialValue = this.value;
- this.emit('wa-change');
+ this.dispatchEvent(new WaChangeEvent());
}
},
initialEvent: event
@@ -315,14 +318,14 @@ export default class WaColorPicker extends WebAwesomeFormAssociatedElement {
if (this.value !== currentValue) {
currentValue = this.value;
- this.emit('wa-input');
+ this.dispatchEvent(new WaInputEvent());
}
},
onStop: () => {
this.isDraggingGridHandle = false;
if (this.value !== initialValue) {
initialValue = this.value;
- this.emit('wa-change');
+ this.dispatchEvent(new WaChangeEvent());
}
},
initialEvent: event
@@ -358,8 +361,8 @@ export default class WaColorPicker extends WebAwesomeFormAssociatedElement {
}
if (this.value !== oldValue) {
- this.emit('wa-change');
- this.emit('wa-input');
+ this.dispatchEvent(new WaChangeEvent());
+ this.dispatchEvent(new WaInputEvent());
}
}
@@ -392,8 +395,8 @@ export default class WaColorPicker extends WebAwesomeFormAssociatedElement {
}
if (this.value !== oldValue) {
- this.emit('wa-change');
- this.emit('wa-input');
+ this.dispatchEvent(new WaChangeEvent());
+ this.dispatchEvent(new WaInputEvent());
}
}
@@ -426,8 +429,8 @@ export default class WaColorPicker extends WebAwesomeFormAssociatedElement {
}
if (this.value !== oldValue) {
- this.emit('wa-change');
- this.emit('wa-input');
+ this.dispatchEvent(new WaChangeEvent());
+ this.dispatchEvent(new WaInputEvent());
}
}
@@ -446,8 +449,8 @@ export default class WaColorPicker extends WebAwesomeFormAssociatedElement {
}
if (this.value !== oldValue) {
- this.emit('wa-change');
- this.emit('wa-input');
+ this.dispatchEvent(new WaChangeEvent());
+ this.dispatchEvent(new WaInputEvent());
}
}
@@ -467,8 +470,8 @@ export default class WaColorPicker extends WebAwesomeFormAssociatedElement {
this.input.value = this.value;
if (this.value !== oldValue) {
- this.emit('wa-change');
- this.emit('wa-input');
+ this.dispatchEvent(new WaChangeEvent());
+ this.dispatchEvent(new WaInputEvent());
}
setTimeout(() => this.input.select());
@@ -643,8 +646,8 @@ export default class WaColorPicker extends WebAwesomeFormAssociatedElement {
this.setColor(colorSelectionResult.sRGBHex);
if (this.value !== oldValue) {
- this.emit('wa-change');
- this.emit('wa-input');
+ this.dispatchEvent(new WaChangeEvent());
+ this.dispatchEvent(new WaInputEvent());
}
})
.catch(() => {
@@ -659,8 +662,8 @@ export default class WaColorPicker extends WebAwesomeFormAssociatedElement {
this.setColor(color);
if (this.value !== oldValue) {
- this.emit('wa-change');
- this.emit('wa-input');
+ this.dispatchEvent(new WaChangeEvent());
+ this.dispatchEvent(new WaInputEvent());
}
}
}
@@ -785,7 +788,7 @@ export default class WaColorPicker extends WebAwesomeFormAssociatedElement {
if (!this.disabled) {
// By standards we have to emit a `wa-invalid` event here synchronously.
- this.emit('wa-invalid');
+ this.dispatchEvent(new WaInvalidEvent());
}
return false;
diff --git a/src/components/copy-button/copy-button.ts b/src/components/copy-button/copy-button.ts
index 0233e550a..dd1835c22 100644
--- a/src/components/copy-button/copy-button.ts
+++ b/src/components/copy-button/copy-button.ts
@@ -5,6 +5,8 @@ import { classMap } from 'lit/directives/class-map.js';
import { customElement, property, query, state } from 'lit/decorators.js';
import { html } from 'lit';
import { LocalizeController } from '../../utilities/localize.js';
+import { WaCopyEvent } from '../../events/copy.js';
+import { WaErrorEvent } from '../../events/error.js';
import componentStyles from '../../styles/component.styles.js';
import styles from './copy-button.styles.js';
import WebAwesomeElement from '../../internal/webawesome-element.js';
@@ -132,27 +134,23 @@ export default class WaCopyButton extends WebAwesomeElement {
} else {
// No target
this.showStatus('error');
- this.emit('wa-error');
+ this.dispatchEvent(new WaErrorEvent());
}
}
// No value
if (!valueToCopy) {
this.showStatus('error');
- this.emit('wa-error');
+ this.dispatchEvent(new WaErrorEvent());
} else {
try {
await navigator.clipboard.writeText(valueToCopy);
this.showStatus('success');
- this.emit('wa-copy', {
- detail: {
- value: valueToCopy
- }
- });
+ this.dispatchEvent(new WaCopyEvent({ value: valueToCopy }));
} catch (error) {
// Rejected by browser
this.showStatus('error');
- this.emit('wa-error');
+ this.dispatchEvent(new WaErrorEvent());
}
}
}
diff --git a/src/components/details/details.test.ts b/src/components/details/details.test.ts
index b09e5095b..35157cc85 100644
--- a/src/components/details/details.test.ts
+++ b/src/components/details/details.test.ts
@@ -1,8 +1,8 @@
// cspell:dictionaries lorem-ipsum
import { expect, fixture, html, waitUntil } from '@open-wc/testing';
import sinon from 'sinon';
-import type { WaHideEvent } from '../../events/wa-hide.js';
-import type { WaShowEvent } from '../../events/wa-show.js';
+import type { WaHideEvent } from '../../events/hide.js';
+import type { WaShowEvent } from '../../events/show.js';
import type WaDetails from './details.js';
describe('', () => {
diff --git a/src/components/details/details.ts b/src/components/details/details.ts
index 7fb04c08d..a755193e5 100644
--- a/src/components/details/details.ts
+++ b/src/components/details/details.ts
@@ -1,9 +1,13 @@
import '../icon/icon.js';
+import { animate, parseDuration, stopAnimations } from '../../internal/animate.js';
import { classMap } from 'lit/directives/class-map.js';
import { customElement, property, query } from 'lit/decorators.js';
import { html } from 'lit';
-import { parseDuration, stopAnimations } from '../../internal/animate.js';
+import { WaAfterHideEvent } from '../../events/after-hide.js';
+import { WaAfterShowEvent } from '../../events/after-show.js';
+import { WaHideEvent } from '../../events/hide.js';
import { waitForEvent } from '../../internal/event.js';
+import { WaShowEvent } from '../../events/show.js';
import { watch } from '../../internal/watch.js';
import componentStyles from '../../styles/component.styles.js';
import styles from './details.styles.js';
@@ -132,7 +136,8 @@ export default class WaDetails extends WebAwesomeElement {
if (this.open) {
this.details.open = true;
// Show
- const slShow = this.emit('wa-show', { cancelable: true });
+ const slShow = new WaShowEvent();
+ this.dispatchEvent(slShow);
if (slShow.defaultPrevented) {
this.open = false;
this.details.open = false;
@@ -142,7 +147,8 @@ export default class WaDetails extends WebAwesomeElement {
await stopAnimations(this.body);
const duration = parseDuration(getComputedStyle(this.body).getPropertyValue('--show-duration'));
// We can't animate to 'auto', so use the scroll height for now
- await this.body.animate(
+ await animate(
+ this.body,
[
{ height: '0', opacity: '0' },
{ height: `${this.body.scrollHeight}px`, opacity: '1' }
@@ -151,13 +157,14 @@ export default class WaDetails extends WebAwesomeElement {
duration,
easing: 'linear'
}
- ).finished;
+ );
this.body.style.height = 'auto';
- this.emit('wa-after-show');
+ this.dispatchEvent(new WaAfterShowEvent());
} else {
// Hide
- const slHide = this.emit('wa-hide', { cancelable: true });
+ const slHide = new WaHideEvent();
+ this.dispatchEvent(slHide);
if (slHide.defaultPrevented) {
this.details.open = true;
this.open = true;
@@ -167,17 +174,18 @@ export default class WaDetails extends WebAwesomeElement {
await stopAnimations(this.body);
const duration = parseDuration(getComputedStyle(this.body).getPropertyValue('--hide-duration'));
// We can't animate from 'auto', so use the scroll height for now
- await this.body.animate(
+ await animate(
+ this.body,
[
{ height: `${this.body.scrollHeight}px`, opacity: '1' },
{ height: '0', opacity: '0' }
],
{ duration, easing: 'linear' }
- ).finished;
+ );
this.body.style.height = 'auto';
this.details.open = false;
- this.emit('wa-after-hide');
+ this.dispatchEvent(new WaAfterHideEvent());
}
}
diff --git a/src/components/dialog/dialog.ts b/src/components/dialog/dialog.ts
index 5123976bc..e47a288d6 100644
--- a/src/components/dialog/dialog.ts
+++ b/src/components/dialog/dialog.ts
@@ -5,6 +5,11 @@ import { customElement, property, query } from 'lit/decorators.js';
import { html } from 'lit';
import { LocalizeController } from '../../utilities/localize.js';
import { lockBodyScrolling, unlockBodyScrolling } from '../../internal/scroll.js';
+import { WaAfterHideEvent } from '../../events/after-hide.js';
+import { WaAfterShowEvent } from '../../events/after-show.js';
+import { WaHideEvent } from '../../events/hide.js';
+import { WaRequestCloseEvent } from '../../events/request-close.js';
+import { WaShowEvent } from '../../events/show.js';
import { watch } from '../../internal/watch.js';
import componentStyles from '../../styles/component.styles.js';
import styles from './dialog.styles.js';
@@ -95,17 +100,15 @@ export default class WaDialog extends WebAwesomeElement {
}
private async requestClose(source: Element) {
- const waRequestClose = this.emit('wa-request-close', {
- cancelable: true,
- detail: { source }
- });
+ const waRequestClose = new WaRequestCloseEvent({ source });
+ this.dispatchEvent(waRequestClose);
if (waRequestClose.defaultPrevented) {
this.open = true;
animateWithClass(this.dialog, 'pulse');
} else {
// Hide
- this.emit('wa-hide');
+ this.dispatchEvent(new WaHideEvent());
this.removeOpenListeners();
await animateWithClass(this.dialog, 'hide');
@@ -120,7 +123,7 @@ export default class WaDialog extends WebAwesomeElement {
setTimeout(() => trigger.focus());
}
- this.emit('wa-after-hide');
+ this.dispatchEvent(new WaAfterHideEvent());
}
}
@@ -193,7 +196,7 @@ export default class WaDialog extends WebAwesomeElement {
/** Shows the dialog. */
private async show() {
// Show
- this.emit('wa-show');
+ this.dispatchEvent(new WaShowEvent());
this.addOpenListeners();
this.originalTrigger = document.activeElement as HTMLElement;
this.open = true;
@@ -211,7 +214,7 @@ export default class WaDialog extends WebAwesomeElement {
await animateWithClass(this.dialog, 'show');
- this.emit('wa-after-show');
+ this.dispatchEvent(new WaAfterShowEvent());
}
render() {
diff --git a/src/components/drawer/drawer.ts b/src/components/drawer/drawer.ts
index ef0dbe4fe..8047ec8a0 100644
--- a/src/components/drawer/drawer.ts
+++ b/src/components/drawer/drawer.ts
@@ -5,6 +5,11 @@ import { customElement, property, query } from 'lit/decorators.js';
import { html } from 'lit';
import { LocalizeController } from '../../utilities/localize.js';
import { lockBodyScrolling, unlockBodyScrolling } from '../../internal/scroll.js';
+import { WaAfterHideEvent } from '../../events/after-hide.js';
+import { WaAfterShowEvent } from '../../events/after-show.js';
+import { WaHideEvent } from '../../events/hide.js';
+import { WaRequestCloseEvent } from '../../events/request-close.js';
+import { WaShowEvent } from '../../events/show.js';
import { watch } from '../../internal/watch.js';
import componentStyles from '../../styles/component.styles.js';
import styles from './drawer.styles.js';
@@ -103,17 +108,15 @@ export default class WaDrawer extends WebAwesomeElement {
}
private async requestClose(source: Element) {
- const waRequestClose = this.emit('wa-request-close', {
- cancelable: true,
- detail: { source }
- });
+ const waRequestClose = new WaRequestCloseEvent({ source });
+ this.dispatchEvent(waRequestClose);
if (waRequestClose.defaultPrevented) {
this.open = true;
animateWithClass(this.drawer, 'pulse');
} else {
// Hide
- this.emit('wa-hide');
+ this.dispatchEvent(new WaHideEvent());
this.removeOpenListeners();
await animateWithClass(this.drawer, 'hide');
@@ -128,7 +131,7 @@ export default class WaDrawer extends WebAwesomeElement {
setTimeout(() => trigger.focus());
}
- this.emit('wa-after-hide');
+ this.dispatchEvent(new WaAfterHideEvent());
}
}
@@ -201,7 +204,7 @@ export default class WaDrawer extends WebAwesomeElement {
/** Shows the drawer. */
private async show() {
// Show
- this.emit('wa-show');
+ this.dispatchEvent(new WaShowEvent());
this.addOpenListeners();
this.originalTrigger = document.activeElement as HTMLElement;
this.open = true;
@@ -219,7 +222,7 @@ export default class WaDrawer extends WebAwesomeElement {
await animateWithClass(this.drawer, 'show');
- this.emit('wa-after-show');
+ this.dispatchEvent(new WaAfterShowEvent());
}
render() {
diff --git a/src/components/dropdown/dropdown.ts b/src/components/dropdown/dropdown.ts
index 2c3c16527..6c8f34ab0 100644
--- a/src/components/dropdown/dropdown.ts
+++ b/src/components/dropdown/dropdown.ts
@@ -4,13 +4,17 @@ import { classMap } from 'lit/directives/class-map.js';
import { customElement, property, query } from 'lit/decorators.js';
import { html } from 'lit';
import { ifDefined } from 'lit/directives/if-defined.js';
+import { WaAfterHideEvent } from '../../events/after-hide.js';
+import { WaAfterShowEvent } from '../../events/after-show.js';
+import { WaHideEvent } from '../../events/hide.js';
import { waitForEvent } from '../../internal/event.js';
+import { WaShowEvent } from '../../events/show.js';
import { watch } from '../../internal/watch.js';
import componentStyles from '../../styles/component.styles.js';
import styles from './dropdown.styles.js';
import WebAwesomeElement from '../../internal/webawesome-element.js';
import type { CSSResultGroup } from 'lit';
-import type { WaSelectEvent } from '../../events/wa-select.js';
+import type { WaSelectEvent } from '../../events/select.js';
import type WaButton from '../button/button.js';
import type WaIconButton from '../icon-button/icon-button.js';
import type WaMenu from '../menu/menu.js';
@@ -361,24 +365,24 @@ export default class WaDropdown extends WebAwesomeElement {
if (this.open) {
// Show
- this.emit('wa-show');
+ this.dispatchEvent(new WaShowEvent());
this.addOpenListeners();
this.panel.hidden = false;
this.popup.active = true;
await animateWithClass(this.popup.popup, 'show-with-scale');
- this.emit('wa-after-show');
+ this.dispatchEvent(new WaAfterShowEvent());
} else {
// Hide
- this.emit('wa-hide');
+ this.dispatchEvent(new WaHideEvent());
this.removeOpenListeners();
await animateWithClass(this.popup.popup, 'hide-with-scale');
this.panel.hidden = true;
this.popup.active = false;
- this.emit('wa-after-hide');
+ this.dispatchEvent(new WaAfterHideEvent());
}
}
diff --git a/src/components/icon-button/icon-button.ts b/src/components/icon-button/icon-button.ts
index 9d6fc010d..f9c368dd0 100644
--- a/src/components/icon-button/icon-button.ts
+++ b/src/components/icon-button/icon-button.ts
@@ -3,6 +3,8 @@ import { classMap } from 'lit/directives/class-map.js';
import { customElement, property, query, state } from 'lit/decorators.js';
import { html, literal } from 'lit/static-html.js';
import { ifDefined } from 'lit/directives/if-defined.js';
+import { WaBlurEvent } from '../../events/blur.js';
+import { WaFocusEvent } from '../../events/focus.js';
import { WebAwesomeFormAssociatedElement } from '../../internal/webawesome-element.js';
import componentStyles from '../../styles/component.styles.js';
import styles from './icon-button.styles.js';
@@ -73,12 +75,12 @@ export default class WaIconButton extends WebAwesomeFormAssociatedElement {
private handleBlur() {
this.hasFocus = false;
- this.emit('wa-blur');
+ this.dispatchEvent(new WaBlurEvent());
}
private handleFocus() {
this.hasFocus = true;
- this.emit('wa-focus');
+ this.dispatchEvent(new WaFocusEvent());
}
private handleClick(event: MouseEvent) {
diff --git a/src/components/icon/icon.test.ts b/src/components/icon/icon.test.ts
index 57d1e1c63..9d7f3c21d 100644
--- a/src/components/icon/icon.test.ts
+++ b/src/components/icon/icon.test.ts
@@ -1,7 +1,7 @@
import { aTimeout, elementUpdated, expect, fixture, html, oneEvent } from '@open-wc/testing';
import { registerIconLibrary } from '../../../dist/webawesome.js';
-import type { WaErrorEvent } from '../../events/wa-error.js';
-import type { WaLoadEvent } from '../../events/wa-load.js';
+import type { WaErrorEvent } from '../../events/error.js';
+import type { WaLoadEvent } from '../../events/load.js';
import type WaIcon from './icon.js';
const testLibraryIcons = {
diff --git a/src/components/icon/icon.ts b/src/components/icon/icon.ts
index b7d62539d..8faf5dc08 100644
--- a/src/components/icon/icon.ts
+++ b/src/components/icon/icon.ts
@@ -2,6 +2,8 @@ import { customElement, property, state } from 'lit/decorators.js';
import { getIconLibrary, type IconLibrary, unwatchIcon, watchIcon } from './library.js';
import { html } from 'lit';
import { isTemplateResult } from 'lit/directive-helpers.js';
+import { WaErrorEvent } from '../../events/error.js';
+import { WaLoadEvent } from '../../events/load.js';
import { watch } from '../../internal/watch.js';
import componentStyles from '../../styles/component.styles.js';
import styles from './icon.styles.js';
@@ -206,12 +208,12 @@ export default class WaIcon extends WebAwesomeElement {
case RETRYABLE_ERROR:
case CACHEABLE_ERROR:
this.svg = null;
- this.emit('wa-error');
+ this.dispatchEvent(new WaErrorEvent());
break;
default:
this.svg = svg.cloneNode(true) as SVGElement;
library?.mutator?.(this.svg);
- this.emit('wa-load');
+ this.dispatchEvent(new WaLoadEvent());
}
}
diff --git a/src/components/image-comparer/image-comparer.ts b/src/components/image-comparer/image-comparer.ts
index 941c9781c..9f3467ec3 100644
--- a/src/components/image-comparer/image-comparer.ts
+++ b/src/components/image-comparer/image-comparer.ts
@@ -5,6 +5,7 @@ import { customElement, property, query } from 'lit/decorators.js';
import { drag } from '../../internal/drag.js';
import { html } from 'lit';
import { styleMap } from 'lit/directives/style-map.js';
+import { WaChangeEvent } from '../../events/change.js';
import { watch } from '../../internal/watch.js';
import componentStyles from '../../styles/component.styles.js';
import styles from './image-comparer.styles.js';
@@ -89,7 +90,7 @@ export default class WaImageComparer extends WebAwesomeElement {
@watch('position', { waitUntilFirstUpdate: true })
handlePositionChange() {
- this.emit('wa-change');
+ this.dispatchEvent(new WaChangeEvent());
}
render() {
diff --git a/src/components/include/include.test.ts b/src/components/include/include.test.ts
index acd165635..33611d6ac 100644
--- a/src/components/include/include.test.ts
+++ b/src/components/include/include.test.ts
@@ -48,7 +48,7 @@ describe('', () => {
expect(loadHandler).to.have.been.calledOnce;
});
- it('should emit wa-error when content cannot be loaded', async () => {
+ it('should emit wa-include-error when content cannot be loaded', async () => {
sinon.stub(window, 'fetch').resolves({
...stubbedFetchResponse,
ok: false,
@@ -58,7 +58,7 @@ describe('', () => {
const el = await fixture(html` `);
const loadHandler = sinon.spy();
- el.addEventListener('wa-error', loadHandler);
+ el.addEventListener('wa-include-error', loadHandler);
await waitUntil(() => loadHandler.calledOnce);
expect(loadHandler).to.have.been.calledOnce;
diff --git a/src/components/include/include.ts b/src/components/include/include.ts
index 36ab62140..fe789a3f6 100644
--- a/src/components/include/include.ts
+++ b/src/components/include/include.ts
@@ -1,6 +1,8 @@
import { customElement, property } from 'lit/decorators.js';
import { html } from 'lit';
import { requestInclude } from './request.js';
+import { WaIncludeErrorEvent } from '../../events/include-error.js';
+import { WaLoadEvent } from '../../events/load.js';
import { watch } from '../../internal/watch.js';
import componentStyles from '../../styles/component.styles.js';
import styles from './include.styles.js';
@@ -55,7 +57,7 @@ export default class WaInclude extends WebAwesomeElement {
}
if (!file.ok) {
- this.emit('wa-error', { detail: { status: file.status } });
+ this.dispatchEvent(new WaIncludeErrorEvent({ status: file.status }));
return;
}
@@ -65,9 +67,9 @@ export default class WaInclude extends WebAwesomeElement {
[...this.querySelectorAll('script')].forEach(script => this.executeScript(script));
}
- this.emit('wa-load');
+ this.dispatchEvent(new WaLoadEvent());
} catch {
- this.emit('wa-error', { detail: { status: -1 } });
+ this.dispatchEvent(new WaIncludeErrorEvent({ status: -1 }));
}
}
diff --git a/src/components/input/input.ts b/src/components/input/input.ts
index eba75a2bd..582e1394c 100644
--- a/src/components/input/input.ts
+++ b/src/components/input/input.ts
@@ -7,6 +7,11 @@ import { ifDefined } from 'lit/directives/if-defined.js';
import { live } from 'lit/directives/live.js';
import { LocalizeController } from '../../utilities/localize.js';
import { MirrorValidator } from '../../internal/validators/mirror-validator.js';
+import { WaBlurEvent } from '../../events/blur.js';
+import { WaChangeEvent } from '../../events/change.js';
+import { WaClearEvent } from '../../events/clear.js';
+import { WaFocusEvent } from '../../events/focus.js';
+import { WaInputEvent } from '../../events/input.js';
import { watch } from '../../internal/watch.js';
import { WebAwesomeFormAssociatedElement } from '../../internal/webawesome-element.js';
import componentStyles from '../../styles/component.styles.js';
@@ -240,12 +245,12 @@ export default class WaInput extends WebAwesomeFormAssociatedElement {
private handleBlur() {
this.hasFocus = false;
- this.emit('wa-blur');
+ this.dispatchEvent(new WaBlurEvent());
}
private handleChange() {
this.value = this.input.value;
- this.emit('wa-change');
+ this.dispatchEvent(new WaChangeEvent());
}
private handleClearClick(event: MouseEvent) {
@@ -253,9 +258,9 @@ export default class WaInput extends WebAwesomeFormAssociatedElement {
if (this.value !== '') {
this.value = '';
- this.emit('wa-clear');
- this.emit('wa-input');
- this.emit('wa-change');
+ this.dispatchEvent(new WaClearEvent());
+ this.dispatchEvent(new WaInputEvent());
+ this.dispatchEvent(new WaChangeEvent());
}
this.input.focus();
@@ -263,12 +268,12 @@ export default class WaInput extends WebAwesomeFormAssociatedElement {
private handleFocus() {
this.hasFocus = true;
- this.emit('wa-focus');
+ this.dispatchEvent(new WaFocusEvent());
}
private handleInput() {
this.value = this.input.value;
- this.emit('wa-input');
+ this.dispatchEvent(new WaInputEvent());
}
private handleKeyDown(event: KeyboardEvent) {
diff --git a/src/components/menu-item/menu-item.test.ts b/src/components/menu-item/menu-item.test.ts
index 14afbeebb..8ec838031 100644
--- a/src/components/menu-item/menu-item.test.ts
+++ b/src/components/menu-item/menu-item.test.ts
@@ -1,7 +1,7 @@
import { expect, fixture, html, waitUntil } from '@open-wc/testing';
import { sendKeys } from '@web/test-runner-commands';
import sinon from 'sinon';
-import type { WaSelectEvent } from '../../events/wa-select.js';
+import type { WaSelectEvent } from '../../events/select.js';
import type WaMenuItem from './menu-item.js';
describe('', () => {
diff --git a/src/components/menu-item/menu-item.ts b/src/components/menu-item/menu-item.ts
index f125cfa98..aac1c4b21 100644
--- a/src/components/menu-item/menu-item.ts
+++ b/src/components/menu-item/menu-item.ts
@@ -87,7 +87,8 @@ export default class WaMenuItem extends WebAwesomeElement {
// When the label changes, emit a slotchange event so parent controls see it
if (textLabel !== this.cachedTextLabel) {
this.cachedTextLabel = textLabel;
- this.emit('slotchange', { bubbles: true, composed: false, cancelable: false });
+ /** @internal - prevent the CEM from recording this event */
+ this.dispatchEvent(new Event('slotchange', { bubbles: true, composed: false, cancelable: false }));
}
}
diff --git a/src/components/menu/menu.test.ts b/src/components/menu/menu.test.ts
index 538088e3b..d89ec1291 100644
--- a/src/components/menu/menu.test.ts
+++ b/src/components/menu/menu.test.ts
@@ -3,7 +3,7 @@ import { expect, fixture } from '@open-wc/testing';
import { html } from 'lit';
import { sendKeys } from '@web/test-runner-commands';
import sinon from 'sinon';
-import type { WaSelectEvent } from '../../events/wa-select.js';
+import type { WaSelectEvent } from '../../events/select.js';
import type WaMenu from './menu.js';
describe('', () => {
diff --git a/src/components/menu/menu.ts b/src/components/menu/menu.ts
index 3e15329c4..922e1f9ca 100644
--- a/src/components/menu/menu.ts
+++ b/src/components/menu/menu.ts
@@ -1,6 +1,7 @@
import '../menu-item/menu-item.js';
import { customElement, query } from 'lit/decorators.js';
import { html } from 'lit';
+import { WaSelectEvent } from '../../events/select.js';
import componentStyles from '../../styles/component.styles.js';
import styles from './menu.styles.js';
import WebAwesomeElement from '../../internal/webawesome-element.js';
@@ -48,7 +49,7 @@ export default class WaMenu extends WebAwesomeElement {
item.checked = !item.checked;
}
- this.emit('wa-select', { detail: { item } });
+ this.dispatchEvent(new WaSelectEvent({ item }));
}
private handleKeyDown(event: KeyboardEvent) {
diff --git a/src/components/mutation-observer/mutation-observer.ts b/src/components/mutation-observer/mutation-observer.ts
index b78afa0f5..485741acd 100644
--- a/src/components/mutation-observer/mutation-observer.ts
+++ b/src/components/mutation-observer/mutation-observer.ts
@@ -1,5 +1,6 @@
import { customElement, property } from 'lit/decorators.js';
import { html } from 'lit';
+import { WaMutationEvent } from '../../events/mutation.js';
import { watch } from '../../internal/watch.js';
import componentStyles from '../../styles/component.styles.js';
import styles from './mutation-observer.styles.js';
@@ -59,9 +60,7 @@ export default class WaMutationObserver extends WebAwesomeElement {
}
private handleMutation = (mutationList: MutationRecord[]) => {
- this.emit('wa-mutation', {
- detail: { mutationList }
- });
+ this.dispatchEvent(new WaMutationEvent({ mutationList }));
};
private startObserver() {
diff --git a/src/components/option/option.ts b/src/components/option/option.ts
index 367f0e71a..e59ec6f1f 100644
--- a/src/components/option/option.ts
+++ b/src/components/option/option.ts
@@ -69,7 +69,8 @@ export default class WaOption extends WebAwesomeElement {
// When the label changes, emit a slotchange event so parent controls see it
if (textLabel !== this.cachedTextLabel) {
this.cachedTextLabel = textLabel;
- this.emit('slotchange', { bubbles: true, composed: false, cancelable: false });
+ /** @internal - prevent the CEM from recording this event */
+ this.dispatchEvent(new Event('slotchange', { bubbles: true, composed: false, cancelable: false }));
}
}
diff --git a/src/components/popup/popup.ts b/src/components/popup/popup.ts
index 704028712..ba6adb52e 100644
--- a/src/components/popup/popup.ts
+++ b/src/components/popup/popup.ts
@@ -3,6 +3,7 @@ import { classMap } from 'lit/directives/class-map.js';
import { customElement, property, query } from 'lit/decorators.js';
import { html } from 'lit';
import { offsetParent } from 'composed-offset-position';
+import { WaRepositionEvent } from '../../events/reposition.js';
import componentStyles from '../../styles/component.styles.js';
import styles from './popup.styles.js';
import WebAwesomeElement from '../../internal/webawesome-element.js';
@@ -470,7 +471,7 @@ export default class WaPopup extends WebAwesomeElement {
// Wait until the new position is drawn before updating the hover bridge, otherwise it can get out of sync
requestAnimationFrame(() => this.updateHoverBridge());
- this.emit('wa-reposition');
+ this.dispatchEvent(new WaRepositionEvent());
}
private updateHoverBridge = () => {
diff --git a/src/components/radio-button/radio-button.ts b/src/components/radio-button/radio-button.ts
index 88c06cc61..d2e0bd11a 100644
--- a/src/components/radio-button/radio-button.ts
+++ b/src/components/radio-button/radio-button.ts
@@ -3,6 +3,8 @@ import { customElement, property, query, state } from 'lit/decorators.js';
import { HasSlotController } from '../../internal/slot.js';
import { html } from 'lit/static-html.js';
import { ifDefined } from 'lit/directives/if-defined.js';
+import { WaBlurEvent } from '../../events/blur.js';
+import { WaFocusEvent } from '../../events/focus.js';
import { watch } from '../../internal/watch.js';
import { WebAwesomeFormAssociatedElement } from '../../internal/webawesome-element.js';
import componentStyles from '../../styles/component.styles.js';
@@ -76,7 +78,7 @@ export default class WaRadioButton extends WebAwesomeFormAssociatedElement {
private handleBlur() {
this.hasFocus = false;
- this.emit('wa-blur');
+ this.dispatchEvent(new WaBlurEvent());
}
private handleClick(e: MouseEvent) {
@@ -91,7 +93,7 @@ export default class WaRadioButton extends WebAwesomeFormAssociatedElement {
private handleFocus() {
this.hasFocus = true;
- this.emit('wa-focus');
+ this.dispatchEvent(new WaFocusEvent());
}
@watch('disabled', { waitUntilFirstUpdate: true })
diff --git a/src/components/radio-group/radio-group.test.ts b/src/components/radio-group/radio-group.test.ts
index ffe28ccd0..1db697f52 100644
--- a/src/components/radio-group/radio-group.test.ts
+++ b/src/components/radio-group/radio-group.test.ts
@@ -3,7 +3,7 @@ import { clickOnElement } from '../../internal/test.js';
import { runFormControlBaseTests } from '../../internal/test/form-control-base-tests.js';
import { sendKeys } from '@web/test-runner-commands';
import sinon from 'sinon';
-import type { WaChangeEvent } from '../../events/wa-change.js';
+import type { WaChangeEvent } from '../../events/change.js';
import type WaRadio from '../radio/radio.js';
import type WaRadioGroup from './radio-group.js';
diff --git a/src/components/radio-group/radio-group.ts b/src/components/radio-group/radio-group.ts
index 6d6461341..9b5d0c7be 100644
--- a/src/components/radio-group/radio-group.ts
+++ b/src/components/radio-group/radio-group.ts
@@ -6,6 +6,8 @@ import { HasSlotController } from '../../internal/slot.js';
import { html } from 'lit';
import { RequiredValidator } from '../../internal/validators/required-validator.js';
import { uniqueId } from '../../internal/math.js';
+import { WaChangeEvent } from '../../events/change.js';
+import { WaInputEvent } from '../../events/input.js';
import { watch } from '../../internal/watch.js';
import { WebAwesomeFormAssociatedElement } from '../../internal/webawesome-element.js';
import componentStyles from '../../styles/component.styles.js';
@@ -123,8 +125,8 @@ export default class WaRadioGroup extends WebAwesomeFormAssociatedElement {
}
if (this.value !== oldValue) {
- this.emit('wa-change');
- this.emit('wa-input');
+ this.dispatchEvent(new WaChangeEvent());
+ this.dispatchEvent(new WaInputEvent());
}
};
@@ -259,8 +261,8 @@ export default class WaRadioGroup extends WebAwesomeFormAssociatedElement {
}
if (this.value !== oldValue) {
- this.emit('wa-change');
- this.emit('wa-input');
+ this.dispatchEvent(new WaChangeEvent());
+ this.dispatchEvent(new WaInputEvent());
}
event.preventDefault();
diff --git a/src/components/radio/radio.ts b/src/components/radio/radio.ts
index d79113315..de3b0eabe 100644
--- a/src/components/radio/radio.ts
+++ b/src/components/radio/radio.ts
@@ -2,6 +2,8 @@ import '../icon/icon.js';
import { classMap } from 'lit/directives/class-map.js';
import { customElement, property, state } from 'lit/decorators.js';
import { html } from 'lit';
+import { WaBlurEvent } from '../../events/blur.js';
+import { WaFocusEvent } from '../../events/focus.js';
import { watch } from '../../internal/watch.js';
import { WebAwesomeFormAssociatedElement } from '../../internal/webawesome-element.js';
import componentStyles from '../../styles/component.styles.js';
@@ -76,12 +78,12 @@ export default class WaRadio extends WebAwesomeFormAssociatedElement {
private handleBlur = () => {
this.hasFocus = false;
- this.emit('wa-blur');
+ this.dispatchEvent(new WaBlurEvent());
};
private handleFocus = () => {
this.hasFocus = true;
- this.emit('wa-focus');
+ this.dispatchEvent(new WaFocusEvent());
};
private setInitialAttributes() {
diff --git a/src/components/range/range.ts b/src/components/range/range.ts
index d9fd83615..03fc0a989 100644
--- a/src/components/range/range.ts
+++ b/src/components/range/range.ts
@@ -6,6 +6,10 @@ import { ifDefined } from 'lit/directives/if-defined.js';
import { live } from 'lit/directives/live.js';
import { LocalizeController } from '../../utilities/localize.js';
import { MirrorValidator } from '../../internal/validators/mirror-validator.js';
+import { WaBlurEvent } from '../../events/blur.js';
+import { WaChangeEvent } from '../../events/change.js';
+import { WaFocusEvent } from '../../events/focus.js';
+import { WaInputEvent } from '../../events/input.js';
import { watch } from '../../internal/watch.js';
import { WebAwesomeFormAssociatedElement } from '../../internal/webawesome-element.js';
import componentStyles from '../../styles/component.styles.js';
@@ -128,25 +132,25 @@ export default class WaRange extends WebAwesomeFormAssociatedElement {
}
private handleChange() {
- this.emit('wa-change');
+ this.dispatchEvent(new WaChangeEvent());
}
private handleInput() {
this.value = parseFloat(this.input.value);
- this.emit('wa-input');
+ this.dispatchEvent(new WaInputEvent());
this.syncRange();
}
private handleBlur() {
this.hasFocus = false;
this.hasTooltip = false;
- this.emit('wa-blur');
+ this.dispatchEvent(new WaBlurEvent());
}
private handleFocus() {
this.hasFocus = true;
this.hasTooltip = true;
- this.emit('wa-focus');
+ this.dispatchEvent(new WaFocusEvent());
}
@eventOptions({ passive: true })
diff --git a/src/components/rating/rating.ts b/src/components/rating/rating.ts
index 9976a9a4d..1ad897c85 100644
--- a/src/components/rating/rating.ts
+++ b/src/components/rating/rating.ts
@@ -5,6 +5,8 @@ import { customElement, eventOptions, property, query, state } from 'lit/decorat
import { html } from 'lit';
import { styleMap } from 'lit/directives/style-map.js';
import { unsafeHTML } from 'lit/directives/unsafe-html.js';
+import { WaChangeEvent } from '../../events/change.js';
+import { WaHoverEvent } from '../../events/hover.js';
import { watch } from '../../internal/watch.js';
import componentStyles from '../../styles/component.styles.js';
import styles from './rating.styles.js';
@@ -93,7 +95,7 @@ export default class WaRating extends WebAwesomeElement {
}
this.setValue(this.getValueFromMousePosition(event));
- this.emit('wa-change');
+ this.dispatchEvent(new WaChangeEvent());
}
private setValue(newValue: number) {
@@ -137,7 +139,7 @@ export default class WaRating extends WebAwesomeElement {
}
if (this.value !== oldValue) {
- this.emit('wa-change');
+ this.dispatchEvent(new WaChangeEvent());
}
}
@@ -170,7 +172,7 @@ export default class WaRating extends WebAwesomeElement {
private handleTouchEnd(event: TouchEvent) {
this.isHovering = false;
this.setValue(this.hoverValue);
- this.emit('wa-change');
+ this.dispatchEvent(new WaChangeEvent());
// Prevent click on mobile devices
event.preventDefault();
@@ -183,22 +185,22 @@ export default class WaRating extends WebAwesomeElement {
@watch('hoverValue')
handleHoverValueChange() {
- this.emit('wa-hover', {
- detail: {
+ this.dispatchEvent(
+ new WaHoverEvent({
phase: 'move',
value: this.hoverValue
- }
- });
+ })
+ );
}
@watch('isHovering')
handleIsHoveringChange() {
- this.emit('wa-hover', {
- detail: {
+ this.dispatchEvent(
+ new WaHoverEvent({
phase: this.isHovering ? 'start' : 'end',
value: this.hoverValue
- }
- });
+ })
+ );
}
/** Sets focus on the rating. */
diff --git a/src/components/resize-observer/resize-observer.ts b/src/components/resize-observer/resize-observer.ts
index c432d97ff..219d45e9c 100644
--- a/src/components/resize-observer/resize-observer.ts
+++ b/src/components/resize-observer/resize-observer.ts
@@ -1,5 +1,6 @@
import { customElement, property } from 'lit/decorators.js';
import { html } from 'lit';
+import { WaResizeEvent } from '../../events/resize.js';
import { watch } from '../../internal/watch.js';
import componentStyles from '../../styles/component.styles.js';
import styles from './resize-observer.styles.js';
@@ -29,7 +30,7 @@ export default class WaResizeObserver extends WebAwesomeElement {
connectedCallback() {
super.connectedCallback();
this.resizeObserver = new ResizeObserver((entries: ResizeObserverEntry[]) => {
- this.emit('wa-resize', { detail: { entries } });
+ this.dispatchEvent(new WaResizeEvent({ entries }));
});
if (!this.disabled) {
diff --git a/src/components/select/select.ts b/src/components/select/select.ts
index f61459837..8b361cd9d 100644
--- a/src/components/select/select.ts
+++ b/src/components/select/select.ts
@@ -10,14 +10,23 @@ import { LocalizeController } from '../../utilities/localize.js';
import { RequiredValidator } from '../../internal/validators/required-validator.js';
import { scrollIntoView } from '../../internal/scroll.js';
import { unsafeHTML } from 'lit/directives/unsafe-html.js';
+import { WaAfterHideEvent } from '../../events/after-hide.js';
+import { WaAfterShowEvent } from '../../events/after-show.js';
+import { WaBlurEvent } from '../../events/blur.js';
+import { WaChangeEvent } from '../../events/change.js';
+import { WaClearEvent } from '../../events/clear.js';
+import { WaFocusEvent } from '../../events/focus.js';
+import { WaHideEvent } from '../../events/hide.js';
+import { WaInputEvent } from '../../events/input.js';
import { waitForEvent } from '../../internal/event.js';
+import { WaShowEvent } from '../../events/show.js';
import { watch } from '../../internal/watch.js';
import { WebAwesomeFormAssociatedElement } from '../../internal/webawesome-element.js';
import componentStyles from '../../styles/component.styles.js';
import formControlStyles from '../../styles/form-control.styles.js';
import styles from './select.styles.js';
import type { CSSResultGroup, TemplateResult } from 'lit';
-import type { WaRemoveEvent } from '../../events/wa-remove.js';
+import type { WaRemoveEvent } from '../../events/remove.js';
import type WaOption from '../option/option.js';
import type WaPopup from '../popup/popup.js';
@@ -290,12 +299,12 @@ export default class WaSelect extends WebAwesomeFormAssociatedElement {
private handleFocus() {
this.hasFocus = true;
this.displayInput.setSelectionRange(0, 0);
- this.emit('wa-focus');
+ this.dispatchEvent(new WaFocusEvent());
}
private handleBlur() {
this.hasFocus = false;
- this.emit('wa-blur');
+ this.dispatchEvent(new WaBlurEvent());
}
private handleDocumentFocusIn = (event: KeyboardEvent) => {
@@ -346,8 +355,8 @@ export default class WaSelect extends WebAwesomeFormAssociatedElement {
// Emit after updating
this.updateComplete.then(() => {
- this.emit('wa-input');
- this.emit('wa-change');
+ this.dispatchEvent(new WaInputEvent());
+ this.dispatchEvent(new WaChangeEvent());
});
if (!this.multiple) {
@@ -475,9 +484,9 @@ export default class WaSelect extends WebAwesomeFormAssociatedElement {
// Emit after update
this.updateComplete.then(() => {
- this.emit('wa-clear');
- this.emit('wa-input');
- this.emit('wa-change');
+ this.dispatchEvent(new WaClearEvent());
+ this.dispatchEvent(new WaInputEvent());
+ this.dispatchEvent(new WaChangeEvent());
});
}
}
@@ -506,8 +515,8 @@ export default class WaSelect extends WebAwesomeFormAssociatedElement {
if (this.value !== oldValue) {
// Emit after updating
this.updateComplete.then(() => {
- this.emit('wa-input');
- this.emit('wa-change');
+ this.dispatchEvent(new WaInputEvent());
+ this.dispatchEvent(new WaChangeEvent());
});
}
@@ -543,8 +552,8 @@ export default class WaSelect extends WebAwesomeFormAssociatedElement {
// Emit after updating
this.updateComplete.then(() => {
- this.emit('wa-input');
- this.emit('wa-change');
+ this.dispatchEvent(new WaInputEvent());
+ this.dispatchEvent(new WaChangeEvent());
});
}
}
@@ -675,7 +684,7 @@ export default class WaSelect extends WebAwesomeFormAssociatedElement {
this.setCurrentOption(this.selectedOptions[0] || this.getFirstOption());
// Show
- this.emit('wa-show');
+ this.dispatchEvent(new WaShowEvent());
this.addOpenListeners();
this.listbox.hidden = false;
@@ -693,17 +702,17 @@ export default class WaSelect extends WebAwesomeFormAssociatedElement {
scrollIntoView(this.currentOption, this.listbox, 'vertical', 'auto');
}
- this.emit('wa-after-show');
+ this.dispatchEvent(new WaAfterShowEvent());
} else {
// Hide
- this.emit('wa-hide');
+ this.dispatchEvent(new WaHideEvent());
this.removeOpenListeners();
await animateWithClass(this.popup.popup, 'hide');
this.listbox.hidden = true;
this.popup.active = false;
- this.emit('wa-after-hide');
+ this.dispatchEvent(new WaAfterHideEvent());
}
}
diff --git a/src/components/split-panel/split-panel.ts b/src/components/split-panel/split-panel.ts
index 8f28c4efe..896d29d2a 100644
--- a/src/components/split-panel/split-panel.ts
+++ b/src/components/split-panel/split-panel.ts
@@ -4,6 +4,7 @@ import { drag } from '../../internal/drag.js';
import { html } from 'lit';
import { ifDefined } from 'lit/directives/if-defined.js';
import { LocalizeController } from '../../utilities/localize.js';
+import { WaRepositionEvent } from '../../events/reposition.js';
import { watch } from '../../internal/watch.js';
import componentStyles from '../../styles/component.styles.js';
import styles from './split-panel.styles.js';
@@ -208,7 +209,7 @@ export default class WaSplitPanel extends WebAwesomeElement {
handlePositionChange() {
this.cachedPositionInPixels = this.percentageToPixels(this.position);
this.positionInPixels = this.percentageToPixels(this.position);
- this.emit('wa-reposition');
+ this.dispatchEvent(new WaRepositionEvent());
}
@watch('positionInPixels')
diff --git a/src/components/switch/switch.test.ts b/src/components/switch/switch.test.ts
index 9a10d3a6e..3536b16c7 100644
--- a/src/components/switch/switch.test.ts
+++ b/src/components/switch/switch.test.ts
@@ -183,11 +183,11 @@ describe('', async () => {
`);
const button = form.querySelector('wa-button')!;
- const slSwitch = form.querySelector('wa-switch')!;
+ const waSwitch = form.querySelector('wa-switch')!;
const submitHandler = sinon.spy((event: SubmitEvent) => event.preventDefault());
// Submitting the form after setting custom validity should not trigger the handler
- slSwitch.setCustomValidity('Invalid selection');
+ waSwitch.setCustomValidity('Invalid selection');
form.addEventListener('submit', submitHandler);
button.click();
await aTimeout(100);
@@ -196,13 +196,13 @@ describe('', async () => {
});
it('should be invalid when required and unchecked', async () => {
- const slSwitch = await fixture(html` `);
- expect(slSwitch.checkValidity()).to.be.false;
+ const waSwitch = await fixture(html` `);
+ expect(waSwitch.checkValidity()).to.be.false;
});
it('should be valid when required and checked', async () => {
- const slSwitch = await fixture(html` `);
- expect(slSwitch.checkValidity()).to.be.true;
+ const waSwitch = await fixture(html` `);
+ expect(waSwitch.checkValidity()).to.be.true;
});
it('should be present in form data when using the form attribute and located outside of a