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() {