diff --git a/docs/resources/changelog.md b/docs/resources/changelog.md
index fa97afbda..664f28540 100644
--- a/docs/resources/changelog.md
+++ b/docs/resources/changelog.md
@@ -6,6 +6,11 @@ Components with the Experimental badge
_During the beta period, these restrictions may be relaxed in the event of a mission-critical bug._ 🐛
+## Next
+
+- Added the `disabled` prop to ``
+- Fixed a bug in `` where setting `disabled` initially didn't work
+
## 2.0.0-beta.53
- 🚨 BREAKING: removed `` (use `` instead)
diff --git a/src/components/resize-observer/resize-observer.ts b/src/components/resize-observer/resize-observer.ts
index ed2b217d0..6784c2195 100644
--- a/src/components/resize-observer/resize-observer.ts
+++ b/src/components/resize-observer/resize-observer.ts
@@ -1,6 +1,7 @@
import { LitElement, html } from 'lit';
-import { customElement } from 'lit/decorators.js';
+import { customElement, property } from 'lit/decorators.js';
import { emit } from '../../internal/event';
+import { watch } from '../../internal/watch';
import styles from './resize-observer.styles';
/**
@@ -18,31 +19,60 @@ export default class SlResizeObserver extends LitElement {
private resizeObserver: ResizeObserver;
private observedElements: HTMLElement[] = [];
+ /** Disables the observer. */
+ @property({ type: Boolean, reflect: true }) disabled = false;
+
connectedCallback() {
super.connectedCallback();
this.resizeObserver = new ResizeObserver((entries: ResizeObserverEntry[]) => {
emit(this, 'sl-resize', { detail: { entries } });
});
+
+ if (!this.disabled) {
+ this.startObserver();
+ }
}
disconnectedCallback() {
super.disconnectedCallback();
- this.resizeObserver.disconnect();
+ this.stopObserver();
}
handleSlotChange() {
+ if (!this.disabled) {
+ this.startObserver();
+ }
+ }
+
+ startObserver() {
const slot = this.shadowRoot!.querySelector('slot')!;
- const elements = slot.assignedElements({ flatten: true }) as HTMLElement[];
- // Unwatch previous elements
- this.observedElements.map(el => this.resizeObserver.unobserve(el));
- this.observedElements = [];
+ if (slot) {
+ const elements = slot.assignedElements({ flatten: true }) as HTMLElement[];
- // Watch new elements
- elements.map(el => {
- this.resizeObserver.observe(el);
- this.observedElements.push(el);
- });
+ // Unwatch previous elements
+ this.observedElements.map(el => this.resizeObserver.unobserve(el));
+ this.observedElements = [];
+
+ // Watch new elements
+ elements.map(el => {
+ this.resizeObserver.observe(el);
+ this.observedElements.push(el);
+ });
+ }
+ }
+
+ stopObserver() {
+ this.resizeObserver.disconnect();
+ }
+
+ @watch('disabled', { waitUntilFirstUpdate: true })
+ handleDisabledChange() {
+ if (this.disabled) {
+ this.stopObserver();
+ } else {
+ this.startObserver();
+ }
}
render() {