diff --git a/iframe.html b/iframe.html index 674fbf0..81fa320 100644 --- a/iframe.html +++ b/iframe.html @@ -1330,6 +1330,7 @@ opacity: 0.5; cursor: not-allowed; background: #f0f0f0; + pointer-events: none; } .dog-calculator-percentage-slider:disabled::-webkit-slider-thumb { @@ -1352,6 +1353,7 @@ cursor: not-allowed; background-color: #f8f8f8; border-color: #ddd; + pointer-events: none; } /* Dark theme disabled styles */ @@ -1734,6 +1736,10 @@ if (!slider || !input) return; + // Always keep full 0-100 scale for all sliders + slider.max = 100; + input.max = 100; + if (fs.isLocked) { // Locked sources can't be changed slider.disabled = true; @@ -1744,11 +1750,13 @@ const totalLockedPercentage = lockedSources.reduce((sum, other) => sum + other.percentage, 0); const maxAllowed = 100 - totalLockedPercentage; - // Re-enable and set constraints + // Re-enable slider.disabled = false; input.disabled = false; - slider.max = maxAllowed; - input.max = maxAllowed; + + // Store max allowed for validation (we'll check this in event handlers) + slider.dataset.maxAllowed = maxAllowed; + input.dataset.maxAllowed = maxAllowed; // If current value exceeds max, adjust it if (fs.percentage > maxAllowed) { @@ -1775,7 +1783,20 @@ index !== changedIndex && !fs.isLocked ); - if (otherUnlockedSources.length === 0) return; + // If this is the only unlocked source, force it to fill remaining percentage + if (otherUnlockedSources.length === 0) { + const lockedSources = this.foodSources.filter((fs, index) => + index !== changedIndex && fs.isLocked + ); + const totalLockedPercentage = lockedSources.reduce((sum, fs) => sum + fs.percentage, 0); + const requiredPercentage = 100 - totalLockedPercentage; + + // Force the changed source to the required percentage + this.foodSources[changedIndex].percentage = requiredPercentage; + this.updatePercentageInputs(); + this.updateFoodCalculations(); + return; + } // Calculate total locked percentage (excluding the changed source) const lockedSources = this.foodSources.filter((fs, index) => @@ -1919,7 +1940,35 @@ if (percentageSlider) { percentageSlider.addEventListener('input', () => { - const newPercentage = parseInt(percentageSlider.value); + // Check if this source is locked first + const foodSource = this.foodSources.find(fs => fs.id === id); + if (foodSource && foodSource.isLocked) { + // Reset slider to original value and return + percentageSlider.value = foodSource.percentage; + return; + } + + // Check if this is the only unlocked source (will be forced to fixed percentage) + const otherUnlockedSources = this.foodSources.filter((fs, index) => + fs.id !== id && !fs.isLocked + ); + + if (otherUnlockedSources.length === 0) { + // This is the only unlocked source - don't update display, just call adjustPercentages + // which will force it to the correct value and update display properly + this.adjustPercentages(id, parseInt(percentageSlider.value)); + return; + } + + let newPercentage = parseInt(percentageSlider.value); + const maxAllowed = parseInt(percentageSlider.dataset.maxAllowed) || 100; + + // Constrain to max allowed but keep slider scale 0-100 + if (newPercentage > maxAllowed) { + newPercentage = maxAllowed; + percentageSlider.value = maxAllowed; + } + this.adjustPercentages(id, newPercentage); document.getElementById(`percentage-display-${id}`).textContent = `${newPercentage}%`; }); @@ -1927,7 +1976,21 @@ if (percentageInput) { percentageInput.addEventListener('change', () => { - const newPercentage = Math.max(0, Math.min(100, parseInt(percentageInput.value) || 0)); + // Check if this source is locked first + const foodSource = this.foodSources.find(fs => fs.id === id); + if (foodSource && foodSource.isLocked) { + // Reset input to original value and return + percentageInput.value = foodSource.percentage; + return; + } + + let newPercentage = parseInt(percentageInput.value) || 0; + const maxAllowed = parseInt(percentageInput.dataset.maxAllowed) || 100; + + // Constrain to valid range and max allowed + newPercentage = Math.max(0, Math.min(maxAllowed, newPercentage)); + percentageInput.value = newPercentage; + this.adjustPercentages(id, newPercentage); document.getElementById(`percentage-display-${id}`).textContent = `${newPercentage}%`; });