diff --git a/src/folk-spreadsheet.ts b/src/folk-spreadsheet.ts index 7b951d6..a6318e9 100644 --- a/src/folk-spreadsheet.ts +++ b/src/folk-spreadsheet.ts @@ -180,8 +180,12 @@ export class FolkSpreadsheet extends HTMLElement { } #shadow = this.attachShadow({ mode: 'open' }); - - #textarea!: HTMLTextAreaElement; + #columns = document.createElement('s-columns'); + #rows = document.createElement('s-rows'); + #body = document.createElement('s-body'); + #slot = document.createElement('slot'); + #textarea = document.createElement('textarea'); + #cellStyles = new CSSStyleSheet(); #editedCell: FolkSpreadSheetCell | null = null; @@ -194,12 +198,23 @@ export class FolkSpreadsheet extends HTMLElement { this.addEventListener('focusin', this); this.addEventListener('focusout', this); - this.#shadow.adoptedStyleSheets.push(styles); + this.#shadow.adoptedStyleSheets.push(styles, this.#cellStyles); } connectedCallback() { - this.#shadow.textContent = ''; + const header = document.createElement('s-header'); + header.setAttribute('empty', ''); + this.#textarea.hidden = true; + + this.#slot.addEventListener('slotchange', this.#onSlotUpdate); + + this.#body.appendChild(this.#slot); + + this.#shadow.append(header, this.#columns, this.#rows, this.#body, this.#textarea); + } + + #onSlotUpdate = () => { const columnNames = new Set(); const rowNames = new Set(); @@ -213,10 +228,18 @@ export class FolkSpreadsheet extends HTMLElement { const columns = Array.from({ length: columnNames.size }).map((_, i) => getColumnName(i)); const rows = Array.from({ length: rowNames.size }).map((_, i) => i + 1); - const columnHeaders = columns.map((column) => `${column}`).join('\n'); - const rowHeaders = rows.map((row) => `${row}`).join('\n'); + this.#columns.setHTMLUnsafe( + columns.map((column) => `${column}`).join('\n') + ); + + this.#rows.setHTMLUnsafe(rows.map((row) => `${row}`).join('\n')); + + this.#cellStyles.replaceSync(` + :host { + --column-count: ${columns.length}; + --row-count: ${rows.length}; + } - const style = ``; - - this.style.setProperty('--column-count', columns.length.toString()); - this.style.setProperty('--row-count', rows.length.toString()); - - this.#shadow.setHTMLUnsafe(html` - - ${columnHeaders} - ${rowHeaders} - - - ${style} - `); - - this.#textarea = this.#shadow.querySelector('textarea')!; - } + .join('\n')}`); + }; #range = ''; get range() {