Skip to content

Commit ea8c63e

Browse files
committed
Use shadow dom for canvas impl
1 parent 8e1a711 commit ea8c63e

File tree

3 files changed

+48
-23
lines changed

3 files changed

+48
-23
lines changed

src/index.css

+2-16
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
ce-squircle,
12
.squircle {
23
background: var(--squircle-background-color);
34
border-radius: var(--squircle-border-radius);
@@ -6,23 +7,8 @@
67
border-style: solid;
78
}
89

9-
ce-squircle[impl="canvas"] {
10-
display: grid;
11-
grid-template-rows: 100%;
12-
grid-template-columns: 100%;
13-
grid-template-areas: "fill";
14-
}
15-
16-
ce-squircle[impl="canvas"] > * {
17-
grid-area: fill;
18-
}
19-
20-
.ce-squircle-canvas--canvas {
21-
contain: strict;
22-
z-index: -1000;
23-
}
24-
2510
@supports (background: paint(id)) {
11+
ce-squircle[impl="houdini"],
2612
.squircle {
2713
background: paint(squircle);
2814
border-radius: initial;

src/squircle-canvas.js

+46-5
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,52 @@
11
import { paint } from "@/drawing";
22

3+
const styles = new CSSStyleSheet();
4+
(() => {
5+
styles.replace(`
6+
:host {
7+
display: grid;
8+
grid-template-rows: 100%;
9+
grid-template-columns: 100%;
10+
grid-template-areas: "fill";
11+
}
12+
13+
.canvas {
14+
grid-area: fill;
15+
contain: strict;
16+
z-index: -1000;
17+
}
18+
19+
.content {
20+
grid-area: fill;
21+
}
22+
`);
23+
})();
24+
25+
const template = new DocumentFragment();
26+
27+
(() => {
28+
const canvas = document.createElement("canvas");
29+
const div = document.createElement("div");
30+
div.classList.add("canvas");
31+
div.appendChild(canvas);
32+
template.appendChild(div);
33+
})();
34+
35+
(() => {
36+
const slot = document.createElement("slot");
37+
const div = document.createElement("div");
38+
div.classList.add("content");
39+
div.appendChild(slot);
40+
template.appendChild(div);
41+
})();
42+
343
export default class SquircleCanvas extends HTMLElement {
444
_radius = 0;
545
_fill = "rgba(0, 0, 0, 0)";
646
_borderWidth = 0;
747
_borderColor = "rgba(0, 0, 0, 0)";
848
_animationFrame = -1;
49+
_shadow;
950
/** @type {CanvasRenderingContext2D?} */
1051
_context = null;
1152

@@ -18,16 +59,16 @@ export default class SquircleCanvas extends HTMLElement {
1859

1960
constructor() {
2061
super();
62+
this._shadow = this.attachShadow({ mode: "open" });
2163
}
2264

2365
connectedCallback() {
2466
this.setAttribute("impl", "canvas");
67+
this._shadow.adoptedStyleSheets = [styles];
2568

26-
const canvas = document.createElement("canvas");
27-
const div = document.createElement("div");
28-
div.classList.add("ce-squircle-canvas--canvas");
29-
div.appendChild(canvas);
30-
this.appendChild(div);
69+
this._shadow.appendChild(template.cloneNode(true));
70+
const canvas = this._shadow.querySelector("canvas");
71+
if (!canvas) return;
3172

3273
const ctx = canvas.getContext("2d", {});
3374

src/squircle-houdini.js

-2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@ export default class SquircleHoudini extends HTMLElement {
1212

1313
connectedCallback() {
1414
this.setAttribute("impl", "houdini");
15-
this.classList.add("squircle");
16-
this.style.display = "grid";
1715
}
1816

1917
/**

0 commit comments

Comments
 (0)