import {html, css} from "lit"
import {LitElementWw, option} from "@webwriter/lit"
import {customElement, property} from "lit/decorators.js"
import "@shoelace-style/shoelace/dist/themes/light.css"
import LOCALIZE from "../../localization/generated"
import {msg} from "@lit/localize"
declare global {interface HTMLElementTagNameMap {
"webwriter-pairing-item": WebwriterPairingItem;
}}
@customElement("webwriter-pairing-item")
export class WebwriterPairingItem extends LitElementWw {
localize = LOCALIZE
tabIndex = -1
static styles = css`
:host {
aspect-ratio: 1;
min-width: 125px;
max-width: 350px;
min-height: 125px;
max-height: 350px;
position: relative;
overflow: hidden;
overflow-y: auto;
scrollbar-width: thin;
resize: both;
border: 2px solid var(--sl-color-gray-500);
border-radius: 5px;
background: white;
}
slot {
width: 100%;
height: 100%;
display: flex;
box-sizing: border-box;
position: relative;
font-size: 0.8em;
z-index: 1;
}
:host([droppreview]) slot {
background: lightblue;
}
::slotted(*) {
height: 100%;
width: 100%;
box-sizing: border-box;
}
::slotted(:not(:is(picture, audio, video, img, iframe))) {
padding: 5px !important;
}
#handle {
box-sizing: border-box;
border-radius: 2px;
position: absolute;
left: 1px;
bottom: 1px;
width: 20px;
height: 30px;
display: inline-block;
overflow: hidden;
line-height: 5px;
padding: 6px 4px;
cursor: move;
vertical-align: middle;
font-size: 12px;
font-family: sans-serif;
letter-spacing: 2px;
color: #cccccc;
text-shadow: 1px 0 1px black;
font-weight: 600;
opacity: 0.95;
z-index: 100;
}
#handle::after {
content: '.. .. ..';
}
:host(:not([contenteditable=true]):not([contenteditable=""])) .author-only {
display: none !important;
}
#click-overlay {
position: absolute;
top: 0;
width: 100%;
height: 100%;
cursor: pointer;
}
#click-overlay:hover {
background: var(--sl-color-primary-600);
opacity: 10%;
}
:host(.ww-selected) #click-overlay {
display: none;
}
`
@property({attribute: true, reflect: true, converter: {toAttribute: (v: boolean) => v? "true": "false", fromAttribute: (attr: string) => attr === "true"}})
accessor draggable = true
@property({type: Boolean, attribute: true, reflect: true})
accessor dropPreview = false
connectedCallback(): void {
super.connectedCallback()
this.addEventListener("dragstart", e => {
if(e.target !== this) {
e.preventDefault()
}
// this.dropPreview = undefined
e.dataTransfer.setData("text/html", this.outerHTML)
e.dataTransfer.setData("text/plain", this.id)
// setTimeout(() => this.baseEl.style.visibility = "hidden")
e.stopPropagation()
})
this.addEventListener("drop", e => {
e.stopPropagation()
const id = e.dataTransfer.getData("text/plain")
const el = document.querySelector(`webwriter-pairing-item#${id}`)
if(!el) {
const html = e.dataTransfer.getData("text/html")
this.parentElement.insertAdjacentHTML("beforeend", html)
}
else if(el && !this.contains(el)) {
this.parentElement.insertAdjacentElement("beforeend", el)
}
this.dispatchEvent(new CustomEvent("ww-pairwith", {bubbles: true, detail: {with: id}}))
}, {passive: true})
this.addEventListener("dragover", e => {
this.dropPreview = true
e.preventDefault()
e.stopImmediatePropagation()
})
this.addEventListener("dragleave", () => this.dropPreview = false, {passive: true})
document.addEventListener("dragend", (e) => {
// (e.target as HTMLElement)?.remove()
this.dropPreview = false
}, {passive: true})
}
render() {
return html`