import type { TerrainType } from '../../core/types.js';
import { getAreaTerrains, getLinearTerrains } from '../../core/terrain.js';
import type { ToolMode } from './toolbar.js';
export function createTerrainPicker(
container: HTMLElement,
onChange: (terrain: TerrainType) => void,
): {
setMode: (mode: ToolMode) => void;
getSelected: () => TerrainType | null;
} {
let selected: TerrainType | null = null;
let currentMode: ToolMode = 'select';
function render() {
container.innerHTML = '';
if (currentMode === 'select') {
container.innerHTML = '
Click a hex to inspect it
';
return;
}
const terrains = currentMode === 'paint' ? getAreaTerrains() : getLinearTerrains();
const label = currentMode === 'paint' ? 'Area Terrain' : 'Linear Features';
const sectionLabel = document.createElement('div');
sectionLabel.className = 'terrain-section-label';
sectionLabel.textContent = label;
container.appendChild(sectionLabel);
const grid = document.createElement('div');
grid.className = 'terrain-grid';
for (const terrain of terrains) {
const btn = document.createElement('button');
btn.className = 'terrain-btn';
if (selected?.id === terrain.id) btn.classList.add('selected');
const swatch = document.createElement('span');
swatch.className = 'terrain-swatch';
swatch.style.backgroundColor = terrain.color;
const name = document.createElement('span');
name.textContent = terrain.name;
btn.appendChild(swatch);
btn.appendChild(name);
btn.addEventListener('click', () => {
selected = terrain;
onChange(terrain);
render();
});
grid.appendChild(btn);
}
container.appendChild(grid);
// Auto-select first if nothing selected
if (!selected || !terrains.find(t => t.id === selected!.id)) {
selected = terrains[0] ?? null;
if (selected) onChange(selected);
// Re-render to show selection
const firstBtn = grid.querySelector('.terrain-btn');
firstBtn?.classList.add('selected');
}
}
render();
return {
setMode(mode: ToolMode) {
currentMode = mode;
selected = null;
render();
},
getSelected: () => selected,
};
}