|
|
|
@ -44,18 +44,36 @@ class FileGroup extends HTMLElement { |
|
|
|
} |
|
|
|
` |
|
|
|
this.shadowRoot.appendChild(style) |
|
|
|
this.addNewFile() |
|
|
|
this.addNewFile() |
|
|
|
this.addNewFile() |
|
|
|
if (this.contentEl.childNodes.length === 0) { |
|
|
|
this.addFile() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
addNewFile() { |
|
|
|
addFile({name, data} = {}) { |
|
|
|
const el = document.createElement('m-file-view') |
|
|
|
if (el.name !== undefined) { |
|
|
|
el.name = name |
|
|
|
} |
|
|
|
if (el.name !== undefined) { |
|
|
|
el.data = data |
|
|
|
} |
|
|
|
this.contentEl.appendChild(el) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
class FileView extends HTMLElement { |
|
|
|
icons = { |
|
|
|
menu: ` |
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-three-dots" viewBox="0 0 16 16"> |
|
|
|
<path d="M3 9.5a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm5 0a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3zm5 0a1.5 1.5 0 1 1 0-3 1.5 1.5 0 0 1 0 3z"/> |
|
|
|
</svg> |
|
|
|
`, |
|
|
|
} |
|
|
|
|
|
|
|
text = { |
|
|
|
delete: {en: 'Delete', es: 'Borrar'}, |
|
|
|
} |
|
|
|
|
|
|
|
constructor() { |
|
|
|
super() |
|
|
|
this.attachShadow({mode: 'open'}) |
|
|
|
@ -78,9 +96,25 @@ class FileView extends HTMLElement { |
|
|
|
div.header { |
|
|
|
display: flex; |
|
|
|
flex-direction: row; |
|
|
|
align-items: stretch; |
|
|
|
background-color: #111; |
|
|
|
color: #ddd; |
|
|
|
padding: 3px 0; |
|
|
|
} |
|
|
|
div.header > * { |
|
|
|
background: inherit; |
|
|
|
color: inherit; |
|
|
|
border: none; |
|
|
|
} |
|
|
|
.name { |
|
|
|
flex-grow: 1; |
|
|
|
padding: 0 5px; |
|
|
|
font: inherit; |
|
|
|
font-family: monospace; |
|
|
|
outline: none; |
|
|
|
} |
|
|
|
div.header button svg { |
|
|
|
margin-bottom: -3px; |
|
|
|
} |
|
|
|
div.content { |
|
|
|
display: flex; |
|
|
|
@ -94,6 +128,9 @@ class FileView extends HTMLElement { |
|
|
|
this.headerEl.appendChild(this.nameEl) |
|
|
|
this.editEl = document.createElement('m-text-edit') |
|
|
|
this.contentEl.appendChild(this.editEl) |
|
|
|
this.menuEl = document.createElement('button') |
|
|
|
this.menuEl.innerHTML = this.icons.menu |
|
|
|
this.headerEl.appendChild(this.menuEl) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -101,6 +138,16 @@ class TextEdit extends HTMLElement { |
|
|
|
constructor() { |
|
|
|
super() |
|
|
|
this.attachShadow({mode: 'open'}) |
|
|
|
const stackEl = document.createElement('div') |
|
|
|
stackEl.classList.add('stack') |
|
|
|
this.textEl = document.createElement('textarea') |
|
|
|
this.textEl.classList.add('text') |
|
|
|
this.textEl.rows = 1 |
|
|
|
stackEl.appendChild(this.textEl) |
|
|
|
this.shadowRoot.appendChild(stackEl) |
|
|
|
this.textEl.addEventListener('input', () => { |
|
|
|
stackEl.dataset.copy = this.textEl.value |
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
connectedCallback() { |
|
|
|
@ -119,28 +166,21 @@ class TextEdit extends HTMLElement { |
|
|
|
div.stack::after { |
|
|
|
content: attr(data-copy) " "; |
|
|
|
visibility: hidden; |
|
|
|
resize: none; |
|
|
|
overflow: hidden; |
|
|
|
} |
|
|
|
div.stack::after, div.stack > textarea { |
|
|
|
white-space: pre-wrap; |
|
|
|
border: 1px solid #444; |
|
|
|
padding: 5px; |
|
|
|
border: 1px solid #888; |
|
|
|
padding: 3px; |
|
|
|
font: inherit; |
|
|
|
font-family: monospace; |
|
|
|
grid-area: 1 / 1 / 2 / 2; |
|
|
|
min-height: 1em; |
|
|
|
border-radius: 2px; |
|
|
|
resize: none; |
|
|
|
} |
|
|
|
` |
|
|
|
this.shadowRoot.appendChild(style) |
|
|
|
const stackEl = document.createElement('div') |
|
|
|
stackEl.classList.add('stack') |
|
|
|
this.textEl = document.createElement('textarea') |
|
|
|
this.textEl.classList.add('text') |
|
|
|
stackEl.appendChild(this.textEl) |
|
|
|
this.shadowRoot.appendChild(stackEl) |
|
|
|
this.textEl.addEventListener('input', () => { |
|
|
|
stackEl.dataset.copy = this.textEl.value |
|
|
|
}) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
@ -148,6 +188,7 @@ customElements.define('m-file-group', FileGroup) |
|
|
|
customElements.define('m-file-view', FileView) |
|
|
|
customElements.define('m-text-edit', TextEdit) |
|
|
|
|
|
|
|
|
|
|
|
const fileGroup = document.createElement('m-file-group') |
|
|
|
document.body.appendChild(fileGroup) |
|
|
|
</script> |
|
|
|
|