mantenimento-app 2.1.7 → 2.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/app.js CHANGED
@@ -4376,33 +4376,54 @@ const defaultExpenseItems = [
4376
4376
  ${m.incomeMode === "cu" ? `<br /><strong>${tr("calcIncomeBaseNote")}</strong> ${tr("cuNetNoteText")}` : ""}
4377
4377
  `;
4378
4378
 
4379
- let mainHtml = `<span class="result-main-line">${escapeHtml(tr("calcNoTransferSuggested"))}</span>`;
4379
+ let mainHtml;
4380
4380
  if (m.assegnoDa1a2 > 0.005) {
4381
+ const perChild = m.figli > 1 ? `<div class="result-transfer-child">${eur(m.assegnoDa1a2 / m.figli)}&thinsp;${escapeHtml(currentLang === "en" ? "per child" : "per figlio")}</div>` : "";
4381
4382
  mainHtml = `
4382
- <span class="result-main-flow">${escapeHtml(c1n())} &rarr; ${escapeHtml(c2n())}</span>
4383
- <span class="result-main-amount">${eur(m.assegnoDa1a2)} ${escapeHtml(tr("pdfPerMonth"))}</span>
4383
+ <div class="result-transfer-dir">
4384
+ <span class="result-chip-name">${escapeHtml(c1n())}</span>
4385
+ <span class="result-chip-arr">&rarr;</span>
4386
+ <span class="result-chip-name">${escapeHtml(c2n())}</span>
4387
+ </div>
4388
+ <div class="result-transfer-value">${eur(m.assegnoDa1a2)}<span class="result-transfer-per">&thinsp;${escapeHtml(tr("pdfPerMonth"))}</span></div>
4389
+ ${perChild}
4384
4390
  `;
4385
4391
  } else if (m.assegnoDa2a1 > 0.005) {
4392
+ const perChild = m.figli > 1 ? `<div class="result-transfer-child">${eur(m.assegnoDa2a1 / m.figli)}&thinsp;${escapeHtml(currentLang === "en" ? "per child" : "per figlio")}</div>` : "";
4386
4393
  mainHtml = `
4387
- <span class="result-main-flow">${escapeHtml(c2n())} &rarr; ${escapeHtml(c1n())}</span>
4388
- <span class="result-main-amount">${eur(m.assegnoDa2a1)} ${escapeHtml(tr("pdfPerMonth"))}</span>
4394
+ <div class="result-transfer-dir">
4395
+ <span class="result-chip-name">${escapeHtml(c2n())}</span>
4396
+ <span class="result-chip-arr">&rarr;</span>
4397
+ <span class="result-chip-name">${escapeHtml(c1n())}</span>
4398
+ </div>
4399
+ <div class="result-transfer-value">${eur(m.assegnoDa2a1)}<span class="result-transfer-per">&thinsp;${escapeHtml(tr("pdfPerMonth"))}</span></div>
4400
+ ${perChild}
4389
4401
  `;
4390
4402
  } else {
4391
4403
  const benefitRows = getCompensativeBenefitRows(m, c1n(), c2n());
4404
+ let benefitCardsHtml = "";
4392
4405
  if (benefitRows.length) {
4393
- const benefitsHtml = benefitRows
4394
- .map((row) => `<li><span>${escapeHtml(row.label)}</span><strong>${eur(row.amount)}</strong></li>`)
4406
+ const rawBenefs = Array.isArray(m.compensativeBenefits)
4407
+ ? m.compensativeBenefits.filter((r) => r && Number(r.amount || 0) > 0.005)
4408
+ : [];
4409
+ const typeIcons = { family: "\uD83C\uDFDB", "primary-home-mortgage": "\uD83C\uDFE1" };
4410
+ const cardsHtml = benefitRows
4411
+ .map((row, i) => {
4412
+ const icon = (rawBenefs[i] && typeIcons[rawBenefs[i].type]) || "\u2726";
4413
+ return `<li class="spieg-benefit-card"><span class="spieg-benefit-icon">${icon}</span><span class="spieg-benefit-label">${escapeHtml(row.label)}</span><strong class="spieg-benefit-amount">${eur(row.amount)}</strong></li>`;
4414
+ })
4395
4415
  .join("");
4396
- mainHtml = `
4397
- <span class="result-main-line">${escapeHtml(tr("calcNoTransferSuggested"))}</span>
4416
+ const total = benefitRows.reduce((s, r) => s + r.amount, 0);
4417
+ const totalLabel = currentLang === "en" ? "Total allocated benefits" : "Totale benefici allocati";
4418
+ benefitCardsHtml = `
4398
4419
  <div class="result-benefits-box">
4399
- <span class="result-main-sub">${escapeHtml(tr("calcCompBenefitsLabel"))}</span>
4400
- <ul class="result-benefits-list">${benefitsHtml}</ul>
4420
+ <div class="spieg-benefits-label">&#127873;&ensp;${escapeHtml(tr("calcCompBenefitsLabel"))}</div>
4421
+ <ul class="spieg-benefits-cards">${cardsHtml}</ul>
4422
+ <div class="spieg-benefits-total"><span>${escapeHtml(totalLabel)}</span><strong>${eur(total)}</strong></div>
4401
4423
  </div>
4402
4424
  `;
4403
- } else if (benefitsInline) {
4404
- mainHtml = `<span class="result-main-line">${escapeHtml(msg("calcNoTransferWithBenefits", { benefits: benefitsInline }))}</span>`;
4405
4425
  }
4426
+ mainHtml = `<div class="spieg-no-transfer-badge">&#9878;&#65039;&ensp;${escapeHtml(tr("calcNoTransferSuggested"))}</div>${benefitCardsHtml}`;
4406
4427
  }
4407
4428
  resultMain.innerHTML = mainHtml;
4408
4429
 
@@ -4376,33 +4376,54 @@ const defaultExpenseItems = [
4376
4376
  ${m.incomeMode === "cu" ? `<br /><strong>${tr("calcIncomeBaseNote")}</strong> ${tr("cuNetNoteText")}` : ""}
4377
4377
  `;
4378
4378
 
4379
- let mainHtml = `<span class="result-main-line">${escapeHtml(tr("calcNoTransferSuggested"))}</span>`;
4379
+ let mainHtml;
4380
4380
  if (m.assegnoDa1a2 > 0.005) {
4381
+ const perChild = m.figli > 1 ? `<div class="result-transfer-child">${eur(m.assegnoDa1a2 / m.figli)}&thinsp;${escapeHtml(currentLang === "en" ? "per child" : "per figlio")}</div>` : "";
4381
4382
  mainHtml = `
4382
- <span class="result-main-flow">${escapeHtml(c1n())} &rarr; ${escapeHtml(c2n())}</span>
4383
- <span class="result-main-amount">${eur(m.assegnoDa1a2)} ${escapeHtml(tr("pdfPerMonth"))}</span>
4383
+ <div class="result-transfer-dir">
4384
+ <span class="result-chip-name">${escapeHtml(c1n())}</span>
4385
+ <span class="result-chip-arr">&rarr;</span>
4386
+ <span class="result-chip-name">${escapeHtml(c2n())}</span>
4387
+ </div>
4388
+ <div class="result-transfer-value">${eur(m.assegnoDa1a2)}<span class="result-transfer-per">&thinsp;${escapeHtml(tr("pdfPerMonth"))}</span></div>
4389
+ ${perChild}
4384
4390
  `;
4385
4391
  } else if (m.assegnoDa2a1 > 0.005) {
4392
+ const perChild = m.figli > 1 ? `<div class="result-transfer-child">${eur(m.assegnoDa2a1 / m.figli)}&thinsp;${escapeHtml(currentLang === "en" ? "per child" : "per figlio")}</div>` : "";
4386
4393
  mainHtml = `
4387
- <span class="result-main-flow">${escapeHtml(c2n())} &rarr; ${escapeHtml(c1n())}</span>
4388
- <span class="result-main-amount">${eur(m.assegnoDa2a1)} ${escapeHtml(tr("pdfPerMonth"))}</span>
4394
+ <div class="result-transfer-dir">
4395
+ <span class="result-chip-name">${escapeHtml(c2n())}</span>
4396
+ <span class="result-chip-arr">&rarr;</span>
4397
+ <span class="result-chip-name">${escapeHtml(c1n())}</span>
4398
+ </div>
4399
+ <div class="result-transfer-value">${eur(m.assegnoDa2a1)}<span class="result-transfer-per">&thinsp;${escapeHtml(tr("pdfPerMonth"))}</span></div>
4400
+ ${perChild}
4389
4401
  `;
4390
4402
  } else {
4391
4403
  const benefitRows = getCompensativeBenefitRows(m, c1n(), c2n());
4404
+ let benefitCardsHtml = "";
4392
4405
  if (benefitRows.length) {
4393
- const benefitsHtml = benefitRows
4394
- .map((row) => `<li><span>${escapeHtml(row.label)}</span><strong>${eur(row.amount)}</strong></li>`)
4406
+ const rawBenefs = Array.isArray(m.compensativeBenefits)
4407
+ ? m.compensativeBenefits.filter((r) => r && Number(r.amount || 0) > 0.005)
4408
+ : [];
4409
+ const typeIcons = { family: "\uD83C\uDFDB", "primary-home-mortgage": "\uD83C\uDFE1" };
4410
+ const cardsHtml = benefitRows
4411
+ .map((row, i) => {
4412
+ const icon = (rawBenefs[i] && typeIcons[rawBenefs[i].type]) || "\u2726";
4413
+ return `<li class="spieg-benefit-card"><span class="spieg-benefit-icon">${icon}</span><span class="spieg-benefit-label">${escapeHtml(row.label)}</span><strong class="spieg-benefit-amount">${eur(row.amount)}</strong></li>`;
4414
+ })
4395
4415
  .join("");
4396
- mainHtml = `
4397
- <span class="result-main-line">${escapeHtml(tr("calcNoTransferSuggested"))}</span>
4416
+ const total = benefitRows.reduce((s, r) => s + r.amount, 0);
4417
+ const totalLabel = currentLang === "en" ? "Total allocated benefits" : "Totale benefici allocati";
4418
+ benefitCardsHtml = `
4398
4419
  <div class="result-benefits-box">
4399
- <span class="result-main-sub">${escapeHtml(tr("calcCompBenefitsLabel"))}</span>
4400
- <ul class="result-benefits-list">${benefitsHtml}</ul>
4420
+ <div class="spieg-benefits-label">&#127873;&ensp;${escapeHtml(tr("calcCompBenefitsLabel"))}</div>
4421
+ <ul class="spieg-benefits-cards">${cardsHtml}</ul>
4422
+ <div class="spieg-benefits-total"><span>${escapeHtml(totalLabel)}</span><strong>${eur(total)}</strong></div>
4401
4423
  </div>
4402
4424
  `;
4403
- } else if (benefitsInline) {
4404
- mainHtml = `<span class="result-main-line">${escapeHtml(msg("calcNoTransferWithBenefits", { benefits: benefitsInline }))}</span>`;
4405
4425
  }
4426
+ mainHtml = `<div class="spieg-no-transfer-badge">&#9878;&#65039;&ensp;${escapeHtml(tr("calcNoTransferSuggested"))}</div>${benefitCardsHtml}`;
4406
4427
  }
4407
4428
  resultMain.innerHTML = mainHtml;
4408
4429
 
@@ -475,8 +475,8 @@
475
475
  <div class="live-title">⚡ Impatto in Tempo Reale sul Netto</div>
476
476
  <div class="live-grid" id="liveNet"></div>
477
477
  <div class="result-pill">
478
- <div>🎯 Assegno suggerito</div>
479
- <div id="risultatoMain" class="big">Calcolo in tempo reale</div>
478
+ <div class="result-pill-head"><span>🎯</span><span>Assegno suggerito</span></div>
479
+ <div id="risultatoMain">Calcolo in tempo reale</div>
480
480
  </div>
481
481
  <div id="liveBreakdown"></div>
482
482
  </div>
@@ -583,7 +583,7 @@
583
583
  <script src="supabase.min.js"></script>
584
584
  <script src="fabric.min.js"></script>
585
585
  <script src="html2pdf.bundle.min.js"></script>
586
- <script src="app.js?v=2.1.7"></script>
586
+ <script src="app.js?v=2.1.8"></script>
587
587
  </body>
588
588
  </html>
589
589
 
@@ -2232,6 +2232,79 @@
2232
2232
  color: #123b38;
2233
2233
  }
2234
2234
 
2235
+ .result-pill-head {
2236
+ display: flex;
2237
+ align-items: center;
2238
+ gap: 7px;
2239
+ font-size: 0.71rem;
2240
+ font-weight: 800;
2241
+ text-transform: uppercase;
2242
+ letter-spacing: 0.07em;
2243
+ color: #3a6560;
2244
+ padding-bottom: 9px;
2245
+ margin-bottom: 9px;
2246
+ border-bottom: 1px solid rgba(0,0,0,0.08);
2247
+ }
2248
+
2249
+ .result-transfer-dir {
2250
+ display: inline-flex;
2251
+ align-items: center;
2252
+ gap: 8px;
2253
+ background: linear-gradient(135deg, rgba(27, 110, 100, 0.11), rgba(27, 110, 100, 0.05));
2254
+ border: 1.5px solid rgba(27, 110, 100, 0.24);
2255
+ border-radius: 999px;
2256
+ padding: 6px 16px;
2257
+ margin-bottom: 10px;
2258
+ max-width: 100%;
2259
+ }
2260
+
2261
+ .result-chip-name {
2262
+ font-weight: 800;
2263
+ font-size: 0.9rem;
2264
+ color: #124741;
2265
+ overflow-wrap: anywhere;
2266
+ }
2267
+
2268
+ .result-chip-arr {
2269
+ font-size: 1.1rem;
2270
+ color: #1d7d72;
2271
+ font-weight: 900;
2272
+ flex-shrink: 0;
2273
+ }
2274
+
2275
+ .result-transfer-value {
2276
+ display: block;
2277
+ font-size: 2.0rem;
2278
+ font-weight: 900;
2279
+ color: #0b5e57;
2280
+ line-height: 1.15;
2281
+ letter-spacing: -0.3px;
2282
+ text-shadow: 0 1px 0 rgba(255,255,255,0.75);
2283
+ font-variant-numeric: tabular-nums;
2284
+ margin-bottom: 4px;
2285
+ }
2286
+
2287
+ .result-transfer-per {
2288
+ font-size: 0.48em;
2289
+ font-weight: 700;
2290
+ color: #2d7068;
2291
+ vertical-align: middle;
2292
+ margin-left: 2px;
2293
+ }
2294
+
2295
+ .result-transfer-child {
2296
+ display: inline-block;
2297
+ margin-top: 2px;
2298
+ font-size: 0.78rem;
2299
+ color: #3d6b63;
2300
+ font-weight: 600;
2301
+ font-variant-numeric: tabular-nums;
2302
+ background: rgba(0,0,0,0.045);
2303
+ border-radius: 8px;
2304
+ padding: 3px 10px;
2305
+ border: 1px solid rgba(0,0,0,0.08);
2306
+ }
2307
+
2235
2308
  .result-main-flow {
2236
2309
  display: block;
2237
2310
  font-size: 1.02rem;
@@ -2275,12 +2348,9 @@
2275
2348
  }
2276
2349
 
2277
2350
  .result-benefits-box {
2278
- border: 1px solid #bdd6cf;
2279
- border-radius: 12px;
2280
- background: linear-gradient(180deg, rgba(249, 253, 252, 0.92), rgba(241, 249, 246, 0.92));
2281
- padding: 8px;
2282
2351
  display: grid;
2283
- gap: 8px;
2352
+ gap: 6px;
2353
+ margin-top: 8px;
2284
2354
  }
2285
2355
 
2286
2356
  .result-benefits-list {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mantenimento-app",
3
- "version": "2.1.7",
3
+ "version": "2.1.8",
4
4
  "description": "Frontend + backend architecture for the mantenimento calculator",
5
5
  "type": "commonjs",
6
6
  "main": "backend/calculate-model.js",