shuzi: 修复联合码标签、桌面居中、加付费墙

- 联合码JOINT字典key为三位数,代码生成两位数,改用前缀匹配
- body加flex-direction:column修复桌面端内容偏右
- 添加付费墙:未付则模糊报告内容+解锁按钮,付过显示完整报告
- localStorage 'jiema_paid' 与jiema.html共享付费状态
This commit is contained in:
jackyu66git
2026-07-13 14:30:11 +08:00
parent 573095325f
commit 7f3a85e669
+73 -48
View File
@@ -16,7 +16,7 @@
<style>
@font-face { font-family:'TriangleDigits'; src:url(data:font/woff2;base64,d09GMgABAAAAAAUAAA4AAAAACHwAAASsAAIZmQAAAAAAAAAAAAAAAAAAAAAAAAAAGhYbbBxIBmAANBEQCocshhEBNgIkAxoLGAAEIAWDIgcgG9QGKC4G7Ib6hm2MRajDYhGiDhrol2EQYF1VSXrYswJPkJb83g+eA7l2QeKDmZzBKY+S2Y6GNNvdREZSoL/sv5IIQxUu06If+FX4/z+X49/WsztrTAw5kRt099ubOm5NXEAFHuBcGvAGSjDAgLDn2bZk6fIVBBISV5n1GLNAADYApcVbCydXozYtkTdtbu8OvEOS0PEgPgIdEQfiY0OwiSCOBmAPsl4AYswwdCJQA1FoSBQqZkProGuMIFPAPhuoa8oSVYX8YAQSAZpDCmDZcIkm/ZAjI0LR3A1KzY56XmlDxUYMYNhtcBARzR51kKE7KkxKozJobFeXdNJlKY3czMCYMrUMa/83F2mmEHEHkFJnDXn9YBwBCSjAHYUA3NEIBjQ0BFDLHki2t3+KqVZYkbggAFQ26ho8RWcQ3tl/htql/UbHN70BAoXUbXpAnK4F+eoWL5vNxzpnKT0L1CrUld9zyZWVebLzdRVOGASMYohloBiiuziLHrm5uQI5VmbV7EqrcnVlszArq2tWV6c5C0+s7O5L1+3WqS7Q2737TCeTufqRH9o1O3uOtCpHMUc36sxupMOcNaesYEbpnGdwwlHmrs8VKBTmstgNaLvfBrx5PQ/wj1yzJd01+3LOm+/CzOY4zhHWtXYr5PbIyREYwJnHeFm4pXu2IcxByHzZVWJ3Er3bMQkX9snibM6Y1aTyc3rkXNUJPXpz8SR3SFeH84FFWYV9bzibJvHlL0bRde6KYc9cmiIKk5+FN+NThqtvc8aBGfnF6WzIqLk1ON06sNXy3bLFuIJ8DQT/QGhPY9JrsRk3RddPID33rzz9cLGnXZjvNNQR4659v7m7f0qW1qex/MqwciHDfdsqBnOLCispr6nWU0/DmAXZBdjkTA0M/4LXawb7VDhbjduWNPaWsM25jxyH1ENRUmejPPOk33dOKZ+v4BRLNZQeriawC/Nzxb0nr7/lPdzfGvGf3kgW0N6/tXYq1Si9RA/v58kV3DTY5DgaxwV1Uw5++lzxouLrgNYX82rdHtlWXSn61Di0UAxfhc2HeamcDnfrnVra3xecFNc61xtZhSxqUlFZFQ62rTQ+w3YS4S9Z4bNHHUB7y/fxoxt9pVAyqdOZ66cPKs7Oz8sYj5f2lIpvQPQfX3t4++1V80/rnFtRkIspHBjC5WXnpReTvuTiMVkJsZFp5SVhxARkdDKQhx19XV78vjqr1UAXlvCfnhUiz41CK/6P8dI6eIab2nlH17ap48+X3P/67iJUpWdlq6vNFAQABCB9dmU3fPxwgFPdb2YhMwAvzT++ByhOmZz+3/9vizVMBYAZOVthCvnfDK9OI6rfpSMQ1O8ljbVAg/Zm6S2UNDN4K6A9UySALjrjrgTjPKoUNdG7bdIswFkQgyCYswaJI28NikwKujXQYMBXOC8yEihiaSpGlAKsZbII4YSJENhVwgyBgJQEXSDaUphohpCxTCWZFJKhBY+AiHgRfBMjhobUGOI+OYREilhp4gmpjs63SFuCvHUricIo0nYoVERiSqyLCF+MnFdHwYlnbI0JjLBYonBsPGESCHYCTx5NXJ+7DhJpNTCDOrOPjGrLzlAAAAA) format('woff2'); }
* { box-sizing: border-box; margin: 0; padding: 0; }
body { background-color: #faf7f2; font-family: 'Georgia','Times New Roman','Noto Serif SC',serif; display:flex; justify-content:center; align-items:center; min-height:100vh; color:#6b5b4e; padding:10px 10px 20px; -webkit-user-select:none; user-select:none; -webkit-touch-callout:none; }
body { background-color: #faf7f2; font-family: 'Georgia','Times New Roman','Noto Serif SC',serif; display:flex; flex-direction:column; justify-content:center; align-items:center; min-height:100vh; color:#6b5b4e; padding:10px 10px 20px; -webkit-user-select:none; user-select:none; -webkit-touch-callout:none; }
.container { position:relative; width:600px; max-width:95%; padding:12px 40px 40px; display:flex; flex-direction:column; align-items:center; }
.input-row { display:flex; gap:5px; align-items:center; margin-bottom:24px; font-family:sans-serif; }
.input-row input { width:56px; padding:6px 4px; border:1px solid #d9ccb6; border-radius:3px; font-size:14px; text-align:center; color:#6b5b4e; background:#fff; outline:none; }
@@ -51,6 +51,15 @@
.tooltip { position:fixed; padding:5px 10px; background:#6b5b4e; color:#fff; border-radius:4px; font-size:0.7em; pointer-events:none; opacity:0; transition:opacity 0.12s; z-index:999; max-width:200px; line-height:1.5; font-family:sans-serif; }
.tooltip.on { opacity:1; }
.footer { text-align:center; font-size:0.6em; color:#9b8a78; margin-top:10px; }
/* 付费墙 */
.shuzi-lock { position:relative; border-radius:10px; overflow:hidden; border:1px solid #f2e6d0; }
.shuzi-lock > .blur { filter:blur(5px); pointer-events:none; user-select:none; }
.shuzi-lock .cover { position:absolute; inset:0; z-index:2; background:linear-gradient(180deg, rgba(250,247,242,.5), rgba(250,247,242,.95)); display:flex; flex-direction:column; align-items:center; justify-content:center; text-align:center; padding:20px; }
.shuzi-lock .cover .lk-t { font-size:1.05em; font-weight:700; color:#c47a78; }
.shuzi-lock .cover .lk-d { font-size:0.75em; color:#9b8a78; margin:8px 0 14px; }
.shuzi-lock .cover .lk-btn { background:#c47a78; color:#fff; border:none; padding:10px 28px; border-radius:20px; font-size:0.85em; font-weight:600; cursor:pointer; }
.shuzi-lock.unlocked .cover { display:none; }
.shuzi-lock.unlocked .blur { filter:none; pointer-events:auto; user-select:auto; }
.scene-3d { position:relative; display:flex; justify-content:center; margin:8px 0; cursor:grab; }
.scene-3d:active { cursor:grabbing; }
.scene-3d canvas { display:block; touch-action:none; }
@@ -509,66 +518,80 @@ function update(v,y,m,d){
const freqArr=Object.entries(freq).sort((a,b)=>b[1]-a[1]);
const most=freqArr[0],least=freqArr.filter(([,c])=>c===freqArr[freqArr.length-1][1]);
let html=`<div style="text-align:center;margin-bottom:18px;">`;
html+=`<div style="font-size:2.4em;font-weight:700;color:#c47a78;line-height:1;margin-bottom:4px;">${v.O}号人</div>`;
html+=`<div style="font-size:0.85em;font-weight:600;color:#5a4636;margin-bottom:6px;">${n.title||''}</div>`;
html+=`<div style="font-size:0.75em;color:#6b5b4e;line-height:1.7;max-width:340px;margin:0 auto;text-align:left;">${n.desc||''}</div>`;
html+=`<div style="font-size:0.7em;color:#9b8a78;margin-top:8px;line-height:1.7;text-align:left;max-width:340px;margin-left:auto;margin-right:auto;">`;
html+=`<b>✦ 天赋优势</b>${n.pos||''}<br><b>✦ 人生课题</b>${n.neg||''}<br><b>✦ 五行属性</b>${n.elem||''}<br><b>✦ 适合职业</b>${n.job||''}</div></div>`;
let freeHtml=`<div style="text-align:center;margin-bottom:18px;">`;
freeHtml+=`<div style="font-size:2.4em;font-weight:700;color:#c47a78;line-height:1;margin-bottom:4px;">${v.O}号人</div>`;
freeHtml+=`<div style="font-size:0.85em;font-weight:600;color:#5a4636;margin-bottom:6px;">${n.title||''}</div>`;
freeHtml+=`<div style="font-size:0.75em;color:#6b5b4e;line-height:1.7;max-width:340px;margin:0 auto;text-align:left;">${n.desc||''}</div>`;
freeHtml+=`</div>`;
let premiumHtml=``;
premiumHtml+=`<div style="font-size:0.7em;color:#9b8a78;margin-top:8px;line-height:1.7;text-align:left;max-width:340px;margin-left:auto;margin-right:auto;">`;
premiumHtml+=`<b>✦ 天赋优势</b>${n.pos||''}<br><b>✦ 人生课题</b>${n.neg||''}<br><b>✦ 五行属性</b>${n.elem||''}<br><b>✦ 适合职业</b>${n.job||''}</div></div>`;
html+=`<hr class="divider">`;
html+=`<div style="font-size:0.82em;font-weight:600;color:#5a4636;text-align:center;margin-bottom:8px;">✦ 数字能量分布 ✦</div>`;
html+=`<div style="font-size:0.7em;color:#6b5b4e;text-align:center;margin-bottom:0;">你的生命三角中共有 <b>${allVals.filter(x=>x>=1).length}</b> 个有效数字</div>`;
html+=`<div class="scene-3d" id="scene3d"><canvas></canvas><div class="scene-hint">↻ 左右旋转</div></div>`;
html+=`<div class="freq-label">✦ 能量最强:<b>${most[0]}</b>(出现 ${most[1]} 次)— 该数字特质在你生命中最为突出</div>`;
if(least.length>0)html+=`<div class="freq-label" style="margin-top:0;">✦ 能量最弱:${least.map(([n])=>`<b>${n}</b>`).join('、')}(仅 ${least[0][1]} 次)— 需刻意培养相关特质</div>`;
premiumHtml+=`<hr class="divider">`;
premiumHtml+=`<div style="font-size:0.82em;font-weight:600;color:#5a4636;text-align:center;margin-bottom:8px;">✦ 数字能量分布 ✦</div>`;
premiumHtml+=`<div style="font-size:0.7em;color:#6b5b4e;text-align:center;margin-bottom:0;">你的生命三角中共有 <b>${allVals.filter(x=>x>=1).length}</b> 个有效数字</div>`;
premiumHtml+=`<div class="scene-3d" id="scene3d"><canvas></canvas><div class="scene-hint">↻ 左右旋转</div></div>`;
premiumHtml+=`<div class="freq-label">✦ 能量最强:<b>${most[0]}</b>(出现 ${most[1]} 次)— 该数字特质在你生命中最为突出</div>`;
if(least.length>0)premiumHtml+=`<div class="freq-label" style="margin-top:0;">✦ 能量最弱:${least.map(([n])=>`<b>${n}</b>`).join('、')}(仅 ${least[0][1]} 次)— 需刻意培养相关特质</div>`;
html+=`<hr class="divider">`;
html+=`<div style="font-size:0.82em;font-weight:600;color:#5a4636;text-align:center;margin-bottom:6px;">✦ 三角内外含义 ✦</div>`;
html+=`<div style="font-size:0.7em;line-height:1.7;color:#6b5b4e;padding:0 4px;">`;
html+=`<div><b>▸ 三角内部</b>:代表你内在真实的自我——潜意识的驱动、与生俱来的性格特质、不为人知的内心世界。</div>`;
html+=`<div style="margin-top:3px;"><b>▸ 三角外部</b>:代表外界对你的认知——你在工作、家庭、社交中呈现出的样子,以及他人眼中的你。</div>`;
html+=`<div style="margin-top:3px;"><b>▸ 下方基因</b>(父母遗传):代表来自父亲和母亲的先天遗传基因,是你性格的底层土壤。</div></div>`;
premiumHtml+=`<hr class="divider">`;
premiumHtml+=`<div style="font-size:0.82em;font-weight:600;color:#5a4636;text-align:center;margin-bottom:6px;">✦ 三角内外含义 ✦</div>`;
premiumHtml+=`<div style="font-size:0.7em;line-height:1.7;color:#6b5b4e;padding:0 4px;">`;
premiumHtml+=`<div><b>▸ 三角内部</b>:代表你内在真实的自我——潜意识的驱动、与生俱来的性格特质、不为人知的内心世界。</div>`;
premiumHtml+=`<div style="margin-top:3px;"><b>▸ 三角外部</b>:代表外界对你的认知——你在工作、家庭、社交中呈现出的样子,以及他人眼中的你。</div>`;
premiumHtml+=`<div style="margin-top:3px;"><b>▸ 下方基因</b>(父母遗传):代表来自父亲和母亲的先天遗传基因,是你性格的底层土壤。</div></div>`;
html+=`<hr class="divider">`;
html+=`<div style="font-size:0.82em;font-weight:600;color:#5a4636;text-align:center;margin-bottom:6px;">✦ 性格编码解读 ✦</div>`;
html+=`<div style="font-size:0.7em;line-height:1.8;color:#6b5b4e;padding:0 4px;">`;
html+=`<div style="margin-bottom:4px;"><b>潜意识码:${v.I}${v.J}${v.K}${v.L}</b></div>`;
html+=`<div style="color:#9b8a78;margin-bottom:8px;">这是你内心的真实驱动力,代表你最本能的反应模式。四个数字分别对应你的思维方式、情感表达、行动模式和人际风格。</div>`;
html+=`<div style="margin-bottom:4px;"><b>内心码:${v.M}${v.N}</b></div>`;
html+=`<div style="color:#9b8a78;margin-bottom:8px;">揭示你深层情感模式和核心价值观。两个数字分别主宰理性行动和感性人际,两者的平衡决定你如何面对压力。</div>`;
html+=`<div style="margin-bottom:4px;"><b>坐镇码:${v.I}${v.M}${v.O}</b></div>`;
html+=`<div style="color:#9b8a78;margin-bottom:8px;">性格核心轴线,由潜意识→内心→主性格串联而成,代表你从内在驱动到最终呈现的完整性格链条。是你最稳定、最不易改变的性格底色。</div>`;
html+=`<div style="margin-bottom:4px;"><b>父亲基因:${v.EF.join('')} ${v.GH.join('')}</b> · <b>母亲基因:${v.AB.join('')} ${v.CD.join('')}</b></div>`;
html+=`<div style="color:#9b8a78;">父亲基因(年份 ${v.EF.join('')}${v.GH.join('')})承载家族传承和事业基因,母亲基因(月${v.CD.join('')}${v.AB.join('')})影响情感模式和人际关系基础。</div></div>`;
premiumHtml+=`<hr class="divider">`;
premiumHtml+=`<div style="font-size:0.82em;font-weight:600;color:#5a4636;text-align:center;margin-bottom:6px;">✦ 性格编码解读 ✦</div>`;
premiumHtml+=`<div style="font-size:0.7em;line-height:1.8;color:#6b5b4e;padding:0 4px;">`;
premiumHtml+=`<div style="margin-bottom:4px;"><b>潜意识码:${v.I}${v.J}${v.K}${v.L}</b></div>`;
premiumHtml+=`<div style="color:#9b8a78;margin-bottom:8px;">这是你内心的真实驱动力,代表你最本能的反应模式。四个数字分别对应你的思维方式、情感表达、行动模式和人际风格。</div>`;
premiumHtml+=`<div style="margin-bottom:4px;"><b>内心码:${v.M}${v.N}</b></div>`;
premiumHtml+=`<div style="color:#9b8a78;margin-bottom:8px;">揭示你深层情感模式和核心价值观。两个数字分别主宰理性行动和感性人际,两者的平衡决定你如何面对压力。</div>`;
premiumHtml+=`<div style="margin-bottom:4px;"><b>坐镇码:${v.I}${v.M}${v.O}</b></div>`;
premiumHtml+=`<div style="color:#9b8a78;margin-bottom:8px;">性格核心轴线,由潜意识→内心→主性格串联而成,代表你从内在驱动到最终呈现的完整性格链条。是你最稳定、最不易改变的性格底色。</div>`;
premiumHtml+=`<div style="margin-bottom:4px;"><b>父亲基因:${v.EF.join('')} ${v.GH.join('')}</b> · <b>母亲基因:${v.AB.join('')} ${v.CD.join('')}</b></div>`;
premiumHtml+=`<div style="color:#9b8a78;">父亲基因(年份 ${v.EF.join('')}${v.GH.join('')})承载家族传承和事业基因,母亲基因(月${v.CD.join('')}${v.AB.join('')})影响情感模式和人际关系基础。</div></div>`;
html+=`<hr class="divider">`;
html+=`<div style="font-size:0.82em;font-weight:600;color:#5a4636;text-align:center;margin-bottom:6px;">✦ 数字缺失与过剩 ✦</div>`;
html+=`<div style="font-size:0.7em;line-height:1.7;color:#6b5b4e;padding:0 4px;">`;
if(miss.both.length>0){html+=`<div style="margin-bottom:4px;"><b>⚠ 缺失数字</b></div>`;miss.both.forEach(n=>{html+=`<div style="margin-bottom:3px;">· <b>缺${n}</b>${MISS_MSG[n]||''}</div>`;});}
else html+=`<div style="margin-bottom:4px;color:#9b8a78;">✦ 你的数字分布完整,能量均衡。</div>`;
premiumHtml+=`<hr class="divider">`;
premiumHtml+=`<div style="font-size:0.82em;font-weight:600;color:#5a4636;text-align:center;margin-bottom:6px;">✦ 数字缺失与过剩 ✦</div>`;
premiumHtml+=`<div style="font-size:0.7em;line-height:1.7;color:#6b5b4e;padding:0 4px;">`;
if(miss.both.length>0){premiumHtml+=`<div style="margin-bottom:4px;"><b>⚠ 缺失数字</b></div>`;miss.both.forEach(n=>{premiumHtml+=`<div style="margin-bottom:3px;">· <b>缺${n}</b>${MISS_MSG[n]||''}</div>`;});}
else premiumHtml+=`<div style="margin-bottom:4px;color:#9b8a78;">✦ 你的数字分布完整,能量均衡。</div>`;
const over=[];for(let i=1;i<=9;i++){if(freq[i]>=4&&!miss.both.includes(i))over.push(i);}
if(over.length>0){html+=`<div style="margin-top:6px;margin-bottom:4px;"><b>⚡ 能量过剩</b></div>`;over.forEach(n=>{html+=`<div style="margin-bottom:3px;">· <b>多${n}</b>(×${freq[n]}):${MISS_STRONG[n]||''}</div>`;});}
html+=`</div>`;
if(over.length>0){premiumHtml+=`<div style="margin-top:6px;margin-bottom:4px;"><b>⚡ 能量过剩</b></div>`;over.forEach(n=>{premiumHtml+=`<div style="margin-bottom:3px;">· <b>多${n}</b>(×${freq[n]}):${MISS_STRONG[n]||''}</div>`;});}
premiumHtml+=`</div>`;
const joints=[['I','J'],['J','M'],['M','I'],['K','L'],['L','N'],['N','K'],['M','O'],['O','N'],['M','N'],['Q','P'],['Q','O'],['P','O']].map(([a,b])=>({code:''+v[a]+v[b],label:JOINT[''+v[a]+v[b]]||'—'}));
html+=`<hr class="divider">`;
html+=`<div style="font-size:0.82em;font-weight:600;color:#5a4636;text-align:center;margin-bottom:6px;">✦ 12组联合码详解 ✦</div>`;
html+=`<div style="font-size:0.68em;color:#9b8a78;text-align:center;margin-bottom:8px;">联合码由相邻两个数字组成,揭示你在不同人生阶段的行为模式</div>`;
const joints=[['I','J'],['J','M'],['M','I'],['K','L'],['L','N'],['N','K'],['M','O'],['O','N'],['M','N'],['Q','P'],['Q','O'],['P','O']].map(([a,b])=>{const k=''+v[a]+v[b];const jk=Object.keys(JOINT).find(x=>x.startsWith(k));return {code:k,label:jk?JOINT[jk]:'—'};});
premiumHtml+=`<hr class="divider">`;
premiumHtml+=`<div style="font-size:0.82em;font-weight:600;color:#5a4636;text-align:center;margin-bottom:6px;">✦ 12组联合码详解 ✦</div>`;
premiumHtml+=`<div style="font-size:0.68em;color:#9b8a78;text-align:center;margin-bottom:8px;">联合码由相邻两个数字组成,揭示你在不同人生阶段的行为模式</div>`;
const ages=[
{label:'21—40岁 · 工作和朋友',codes:joints.slice(0,4),desc:'由潜意识码主导,反映你在职场上升期和社交圈中的表现模式。'+(v.I+v.J+v.M>=10?'能量较强,事业心旺盛,社交活跃。':'能量内敛,更注重深度而非广度。')},
{label:'41—60岁 · 儿女和下属',codes:joints.slice(4,8),desc:'由内心码和主性格主导,体现你对下一代和下级的培养方式及中年价值观。'+(v.K+v.L+v.N>=10?'有较强的责任感和支配欲。':'倾向于给予空间,放手让他人成长。')},
{label:'61岁至晚年 · 晚年和家庭',codes:joints.slice(8,12),desc:'由外心码主导,展现你晚年的生活智慧和家庭关系的最终呈现。'+(v.M+v.N+v.O>=10?'晚年活跃,持续发挥影响力。':'晚年宁静,享受内在平和。')},
];
ages.forEach(ag=>{
html+=`<div class="joint-age">${ag.label}</div>`;
html+=`<div style="font-size:0.65em;color:#9b8a78;text-align:center;margin:-2px 0 6px;line-height:1.5;">${ag.desc}</div>`;
html+=`<div class="joint-grid">`;
ag.codes.forEach(jc=>{html+=`<div><span class="jc">${jc.code}</span> <span class="jm">${jc.label}</span></div>`;});
html+=`</div>`;
premiumHtml+=`<div class="joint-age">${ag.label}</div>`;
premiumHtml+=`<div style="font-size:0.65em;color:#9b8a78;text-align:center;margin:-2px 0 6px;line-height:1.5;">${ag.desc}</div>`;
premiumHtml+=`<div class="joint-grid">`;
ag.codes.forEach(jc=>{premiumHtml+=`<div><span class="jc">${jc.code}</span> <span class="jm">${jc.label}</span></div>`;});
premiumHtml+=`</div>`;
});
document.getElementById('missingBlock').innerHTML=html;
const paid=localStorage.getItem('jiema_paid');
const lockEl=document.getElementById('missingBlock');
if(paid){
lockEl.innerHTML=freeHtml+premiumHtml;
}else{
lockEl.innerHTML=freeHtml+'<div class="shuzi-lock" id="shuziLock">'+premiumHtml+'</div>';
const lock=document.getElementById('shuziLock');
Array.from(lock.children).forEach(c=>c.classList.add('blur'));
const cover=document.createElement('div');cover.className='cover';
cover.innerHTML='<div class="lk-t">🔒 解锁完整数字报告</div><div class="lk-d">天赋优势 · 能量分布 · 性格编码 · 12组联合码</div>';
const btn=document.createElement('button');btn.className='lk-btn';btn.textContent='¥39.9 解锁 →';
btn.addEventListener('click',unlockShuzi);cover.appendChild(btn);lock.appendChild(cover);
}
setTimeout(()=>{
const canvas=document.querySelector('#scene3d canvas');
if(canvas){renderScene(canvas,freq,rotZ);setupRotation();}
@@ -593,6 +616,8 @@ function update(v,y,m,d){
document.getElementById('xingzuo-panel').innerHTML=xingZuoHTML(y,m,d);
document.getElementById('wuxing-panel').innerHTML=wuXingHTML(y,m,d);
}
function unlockShuzi(){localStorage.setItem("jiema_paid","1");const l=document.getElementById("shuziLock");l.querySelectorAll(".blur").forEach(c=>c.classList.remove("blur"));l.classList.add("unlocked");}
function go(){const y=+document.getElementById('inY').value,m=+document.getElementById('inM').value,d=+document.getElementById('inD').value;if(!y||!m||!d)return;update(calc(y,m,d),y,m,d)}
document.getElementById('goBtn').addEventListener('click',go);
document.querySelectorAll('.input-row input').forEach(i=>i.addEventListener('keydown',e=>{if(e.key==='Enter')go()}));
@@ -612,4 +637,4 @@ function update(v,y,m,d){
})();
</script>
</body>
</html>
</html>