wired-elements
Version:
Collection of hand-drawn sketchy web components
73 lines (63 loc) • 1.92 kB
text/typescript
import { WiredBase, BaseCSS, Point } from './wired-base';
import { line } from './wired-lib';
import { css, TemplateResult, html, CSSResultArray } from 'lit';
import { customElement, property } from 'lit/decorators.js';
export class WiredDivider extends WiredBase {
elevation = 1;
private resizeObserver?: ResizeObserver;
private windowResizeHandler?: EventListenerOrEventListenerObject;
private roAttached = false;
static get styles(): CSSResultArray {
return [
BaseCSS,
css`
:host {
display: block;
position: relative;
}
`
];
}
render(): TemplateResult {
return html`<svg></svg>`;
}
protected canvasSize(): Point {
const size = this.getBoundingClientRect();
const elev = Math.min(Math.max(1, this.elevation), 5);
return [size.width, elev * 6];
}
protected draw(svg: SVGSVGElement, size: Point) {
const elev = Math.min(Math.max(1, this.elevation), 5);
for (let i = 0; i < elev; i++) {
line(svg, 0, (i * 6) + 3, size[0], (i * 6) + 3, this.seed);
}
}
updated() {
super.updated();
this.attachResizeListener();
}
disconnectedCallback() {
this.detachResizeListener();
}
private attachResizeListener() {
if (!this.roAttached) {
if (this.resizeObserver) {
this.resizeObserver.observe(this);
} else if (!this.windowResizeHandler) {
this.windowResizeHandler = () => this.wiredRender();
window.addEventListener('resize', this.windowResizeHandler, { passive: true });
}
this.roAttached = true;
}
}
private detachResizeListener() {
if (this.resizeObserver) {
this.resizeObserver.unobserve(this);
}
if (this.windowResizeHandler) {
window.removeEventListener('resize', this.windowResizeHandler);
}
this.roAttached = false;
}
}