class WompumGrid { constructor(element, metadata) { this.gridElement = element; this.metadata = metadata; this.gridSize = { columns: parseInt(element.dataset.columns) || 7, rows: parseInt(element.dataset.rows) || 5 }; // Set grid template columns based on data attribute or default this.gridElement.style.gridTemplateColumns = `repeat(${this.gridSize.columns}, 1fr)`; // Generate sigils for each metadata component this.sigils = { narrator: Sigil.generate(metadata.narrator), subject: Sigil.generate(metadata.subject), facilitator: Sigil.generate(metadata.facilitator) }; // Initialize color calculator this.colorCalculator = new ColorCalculator(); // Store sigils as data attributes for future use this.gridElement.dataset.narratorSigil = JSON.stringify(this.sigils.narrator); this.gridElement.dataset.subjectSigil = JSON.stringify(this.sigils.subject); this.gridElement.dataset.facilitatorSigil = JSON.stringify(this.sigils.facilitator); } // Get sigil digit for a cell based on its section and position getSigilDigit(section, position) { const sigil = this.sigils[section]; if (!sigil || !sigil.length) return 0; return sigil[position % sigil.length]; } // Get influences from adjacent cells getInfluences(column, row) { const influences = []; // Check adjacent cells (up, down, left, right) const adjacentPositions = [ [column, row - 1], // up [column, row + 1], // down [column - 1, row], // left [column + 1, row] // right ]; for (const [adjCol, adjRow] of adjacentPositions) { if (adjCol >= 0 && adjCol < this.gridSize.columns && adjRow >= 0 && adjRow < this.gridSize.rows) { const cell = this.gridElement.querySelector( `[data-column="${adjCol}"][data-row="${adjRow}"]` ); if (cell && cell.dataset.sigilDigit) { influences.push(parseInt(cell.dataset.sigilDigit)); } } } return influences; } // Apply metadata-based design to the grid applyMetadataDesign() { const cells = this.gridElement.querySelectorAll('.wompum-cell'); cells.forEach(cell => { const section = cell.dataset.section; const column = parseInt(cell.dataset.column); const row = parseInt(cell.dataset.row); // Get sigil digit for this cell const sigilDigit = this.getSigilDigit(section, row); cell.dataset.sigilDigit = sigilDigit; // Get influences from adjacent cells const influences = this.getInfluences(column, row); // Calculate and apply color const color = this.colorCalculator.getColor(sigilDigit, influences); cell.style.backgroundColor = color; }); } // Initialize the grid init() { if (!this.gridElement) return; this.createGrid(); this.applyMetadataDesign(); this.setGridAreas(); } // Define grid areas for each section setGridAreas() { const totalColumns = this.gridSize.columns; const narratorColumns = 2; const facilitatorColumns = 2; const subjectColumns = totalColumns - narratorColumns - facilitatorColumns; this.gridElement.style.gridTemplateAreas = ` "narrator subject facilitator" `; // this.gridElement.style.gridTemplateColumns = `${narratorColumns}fr ${subjectColumns}fr ${facilitatorColumns}fr`; } // Create the grid cells with position awareness createGrid() { const totalCells = this.gridSize.columns * this.gridSize.rows; for (let i = 0; i < totalCells; i++) { const cell = document.createElement('div'); const column = i % this.gridSize.columns; const row = Math.floor(i / this.gridSize.columns); // Determine which section this cell belongs to let section; if (column < 2) section = 'narrator'; else if (column >= this.gridSize.columns - 2) section = 'facilitator'; else section = 'subject'; cell.className = 'wompum-cell'; cell.setAttribute('data-cell-index', i); cell.setAttribute('data-section', section); cell.setAttribute('data-column', column); cell.setAttribute('data-row', row); this.gridElement.appendChild(cell); } } } // Wait for DOM to be ready document.addEventListener('DOMContentLoaded', () => { // Find all grid elements const gridElements = document.querySelectorAll('.wompum-grid'); // Initialize a grid for each element found gridElements.forEach(element => { let metadata = {}; try { metadata = JSON.parse(element.dataset.metadata || '{}'); } catch (e) { console.error('Error parsing metadata for grid:', e); } const wompum = new WompumGrid(element, metadata); wompum.init(); }); });