Great things are on the horizon

Something big is brewing! Our store is in the works and will be launching soon!

©2026 Creators Board Inc All Rights reserved

/* ================================================================ Recipe Template — calculator.js 汎用レシピ計算機エンジン レシピ固有のロジックは設定オブジェクト(window.RT_RECIPE_CONFIG)に 定義することで、新しいレシピでもこのエンジンを再利用できる ================================================================ */ (function() { 'use strict'; function init(rootEl) { var config = window.RT_RECIPE_CONFIG; if (!config) { console.warn('Recipe Template: window.RT_RECIPE_CONFIG が定義されていません'); return; } var state = {}; config.inputs.forEach(function(input) { state[input.id] = null; }); function setupButtons() { var buttons = rootEl.querySelectorAll('[data-rt-calc]'); for (var i = 0; i < buttons.length; i++) { (function(btn) { btn.addEventListener('click', function() { var param = btn.getAttribute('data-rt-calc'); var value = btn.getAttribute('data-rt-value'); var siblings = rootEl.querySelectorAll('[data-rt-calc="' + param + '"]'); for (var j = 0; j < siblings.length; j++) { siblings[j].classList.remove('rt-active'); } btn.classList.add('rt-active'); // Try numeric conversion if applicable var numVal = parseFloat(value); state[param] = (!isNaN(numVal) && String(numVal) === value) ? numVal : value; update(); }); })(buttons[i]); } var inputs = rootEl.querySelectorAll('[data-rt-input]'); for (var k = 0; k < inputs.length; k++) { (function(inp) { inp.addEventListener('input', function(e) { var param = inp.getAttribute('data-rt-input'); var v = parseFloat(e.target.value); state[param] = (v > 0) ? v : null; update(); }); })(inputs[k]); } } function isComplete() { for (var key in state) { if (state[key] === null || state[key] === undefined) return false; } return true; } function update() { var resultsEl = rootEl.querySelector('[data-rt-results]'); var summaryEl = rootEl.querySelector('[data-rt-summary]'); if (!resultsEl) return; if (!isComplete()) { resultsEl.classList.remove('rt-active'); if (summaryEl && config.placeholderText) { summaryEl.textContent = config.placeholderText; } return; } // Run the recipe-specific calculator function var output; try { output = config.calculate(state); } catch (e) { console.error('Recipe Template calculate error:', e); return; } // Apply outputs to DOM elements with [data-rt-output="key"] Object.keys(output).forEach(function(key) { var el = rootEl.querySelector('[data-rt-output="' + key + '"]'); if (!el) return; var val = output[key]; // Handle objects with { text, show } for conditional display if (val && typeof val === 'object' && 'text' in val) { el.textContent = val.text; el.style.display = val.show === false ? 'none' : ''; } else { el.textContent = val; } }); resultsEl.classList.add('rt-active'); } setupButtons(); } function bootstrap() { var roots = document.querySelectorAll('[data-rt-recipe-calc]'); for (var i = 0; i < roots.length; i++) { init(roots[i]); } } if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', bootstrap); } else { bootstrap(); } })();

Log in with your credentials

Forgot your details?