/** * settings/tabs/workspace.js - Workspace (Canvas/Grid) Settings Tab */ import { updateSetting } from '../store.js'; import { t } from '../../i18n.js'; export function renderWorkspace(container, settings) { container.innerHTML = `

${t('canvas_background') || 'Workspace'}

${t('grid_style')} ${t('grid_style_desc')}
${t('grid_spacing')} ${t('grid_spacing_desc')}
${t('bg_color')} ${t('bg_color_desc')}
${t('grid_color')} ${t('grid_color_desc')}
${t('grid_thickness')} ${t('grid_thickness_desc')}
${t('show_major_grid')} ${t('show_major_grid_desc')}
${t('major_grid_color')} ${t('major_grid_color_desc')}
${t('major_grid_interval')} ${t('major_grid_interval_desc')}
${t('canvas_preset')} ${t('canvas_preset_desc')}
${t('orientation')} ${t('orientation_desc')}
`; } export function bindWorkspaceEvents(container) { const getGridParams = () => ({ style: container.querySelector('#grid-style-select').value, color: container.querySelector('#grid-color-picker').value, thickness: parseFloat(container.querySelector('#grid-thickness-input').value) || 1, showMajor: container.querySelector('#major-grid-toggle').checked, majorColor: container.querySelector('#major-grid-color-picker').value, majorInterval: parseInt(container.querySelector('#major-grid-interval-input').value) || 5 }); const dispatchGridUpdate = () => { const params = getGridParams(); updateSetting('gridStyle', params.style); updateSetting('gridColor', params.color); updateSetting('gridThickness', params.thickness); updateSetting('showMajorGrid', params.showMajor); updateSetting('majorGridColor', params.majorColor); updateSetting('majorGridInterval', params.majorInterval); const majorOpts = container.querySelector('#major-grid-options'); if (majorOpts) majorOpts.style.display = params.showMajor ? 'block' : 'none'; window.dispatchEvent(new CustomEvent('gridChanged', { detail: params })); }; const gridStyleSelect = container.querySelector('#grid-style-select'); gridStyleSelect.addEventListener('change', dispatchGridUpdate); const gridColorPicker = container.querySelector('#grid-color-picker'); gridColorPicker.addEventListener('input', dispatchGridUpdate); const gridThicknessInput = container.querySelector('#grid-thickness-input'); gridThicknessInput.addEventListener('input', dispatchGridUpdate); const majorGridToggle = container.querySelector('#major-grid-toggle'); majorGridToggle.addEventListener('change', dispatchGridUpdate); const majorGridColorPicker = container.querySelector('#major-grid-color-picker'); majorGridColorPicker.addEventListener('input', dispatchGridUpdate); const majorGridIntervalInput = container.querySelector('#major-grid-interval-input'); majorGridIntervalInput.addEventListener('input', dispatchGridUpdate); const gridSpacingInput = container.querySelector('#grid-spacing-input'); gridSpacingInput.addEventListener('input', (e) => { const val = parseInt(e.target.value) || 20; updateSetting('gridSpacing', val); document.documentElement.style.setProperty('--grid-size', `${val}px`); window.dispatchEvent(new CustomEvent('gridSpacingChanged', { detail: { spacing: val } })); }); const bgColorPicker = container.querySelector('#bg-color-picker'); bgColorPicker.addEventListener('input', (e) => { updateSetting('bgColor', e.target.value); document.documentElement.style.setProperty('--bg-color', e.target.value); }); const canvasPreset = container.querySelector('#canvas-preset'); const orientationContainer = container.querySelector('#orientation-container'); const customSizeDiv = container.querySelector('#custom-size-inputs'); const updateCanvas = () => { const val = canvasPreset.value; const orientationSelect = container.querySelector('#canvas-orientation'); const orient = orientationSelect ? orientationSelect.value : 'portrait'; updateSetting('canvasPreset', val); updateSetting('canvasOrientation', orient); if (customSizeDiv) customSizeDiv.style.display = val === 'custom' ? 'flex' : 'none'; if (orientationContainer) orientationContainer.style.display = val === 'full' ? 'none' : 'flex'; let w = '100%', h = '100%'; if (val === 'A4') { w = orient === 'portrait' ? 794 : 1123; h = orient === 'portrait' ? 1123 : 794; } else if (val === 'A3') { w = orient === 'portrait' ? 1123 : 1587; h = orient === 'portrait' ? 1587 : 1123; } else if (val === 'custom') { w = parseInt(container.querySelector('#canvas-width').value) || 800; h = parseInt(container.querySelector('#canvas-height').value) || 600; updateSetting('canvasWidth', w); updateSetting('canvasHeight', h); } window.dispatchEvent(new CustomEvent('canvasResize', { detail: { width: w, height: h } })); }; canvasPreset.addEventListener('change', updateCanvas); const orientationSelect = container.querySelector('#canvas-orientation'); if (orientationSelect) orientationSelect.addEventListener('change', updateCanvas); const applyCustomBtn = container.querySelector('#apply-custom-size'); if (applyCustomBtn) applyCustomBtn.addEventListener('click', updateCanvas); }