-
Ben Eltschig authoredUnverifieda60d9cc4
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
SkribblCanvas.js 2.15 KiB
/**
* Custom element `<skribbl-canvas>` for the canvas that can be drawn on by whoever is currently drawing.
* @todo implement as actual canvas and not just container element
*/
export default class SkribblCanvas extends HTMLElement {
constructor(){
super();
this.attachShadow({mode:"open"});
this.shadowRoot.innerHTML = `
<style>
:host {
display: block;
position: relative;
overflow: hidden;
background: #ffffff;
border-radius: 5px;
}
svg {
display: block;
width: 100%;
}
</style>
<!-- invisible svg to maintain an aspect ratio of 960:720, aka 4:3 -->
<svg viewBox="0 0 960 720"></svg>
<slot name="overlay"></slot>
`;
}
set overlay(overlay){
if (this._overlay){
this._overlay.remove();
}
this._overlay = overlay;
if (overlay){
overlay.slot = "overlay";
this.appendChild(overlay);
}
}
/**
* @type {SkribblCanvasOverlay}
*/
get overlay(){
return this._overlay;
}
}
/**
* Custom element `<skribbl-canvas-overlay>` for overlays on the `<skribbl-canvas>`-element.
*/
export class SkribblCanvasOverlay extends HTMLElement {
/**
* Constructs a new SkribblCanvasOverlay and appends the given nodes or strings to it.
* @param {...(string|Node)} nodes
*/
constructor(...nodes){
super();
this.attachShadow({mode:"open"});
this.shadowRoot.innerHTML = `
<style>
:host {
display: block;
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
background: #000000bf;
color: #ffffff;
}
#contents {
position: absolute;
left: 50%;
top: 50%;
max-width: 80%;
transform: translate(-50%,-50%);
text-align: center;
font-size: 1.3em;
}
::slotted(button) {
padding: 3px 5px;
margin: 3px;
border: none;
border-radius: 3px;
background: #dfdfdf;
color: #000000;
font-size: 1em;
}
::slotted(button:hover) {
cursor: pointer;
}
</style>
<div id="contents">
<slot></slot>
</div>
`;
this.append(...nodes);
}
}
customElements.define("skribbl-canvas",SkribblCanvas);
customElements.define("skribbl-canvas-overlay",SkribblCanvasOverlay);