:root { --brand:#0f766e; --bg:#f5f7f6; --card:#fff; --text:#17201e; --muted:#667370; --line:#dde4e2; --bad:#b42318; --good:#067647; }
* { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; }
body { margin:0; font:16px/1.4 system-ui,-apple-system,"Segoe UI",Roboto,sans-serif; background:var(--bg); color:var(--text); padding-bottom:env(safe-area-inset-bottom); }
.top { position:sticky; top:0; z-index:5; display:flex; justify-content:space-between; align-items:center; gap:.5rem; background:var(--brand); color:#fff; padding:.7rem 1rem; padding-top:calc(.7rem + env(safe-area-inset-top)); }
.brand { color:#fff; font-weight:700; font-size:1.2rem; text-decoration:none; }
#who { font-size:.85rem; }
#who button { background:transparent; color:#fff; border:1px solid #ffffff88; border-radius:.5rem; padding:.25rem .6rem; font-size:.85rem; }
main { max-width:640px; margin:0 auto; padding:1rem; }
h1 { font-size:1.4rem; margin:.2rem 0 1rem; }
h2 { font-size:1.05rem; margin:1.4rem 0 .5rem; }
.card { background:var(--card); border:1px solid var(--line); border-radius:.9rem; padding:.9rem 1rem; margin:.6rem 0; }
a.card { display:block; color:inherit; text-decoration:none; }
.row { display:flex; justify-content:space-between; align-items:baseline; gap:.75rem; }
.muted { color:var(--muted); font-size:.9rem; }
.amount { font-variant-numeric:tabular-nums; font-weight:600; white-space:nowrap; }
.pos { color:var(--good); } .neg { color:var(--bad); }
.badge { display:inline-block; font-size:.72rem; padding:.1rem .5rem; border-radius:1rem; background:#e6f2f0; color:var(--brand); margin-left:.3rem; }
label { display:block; font-size:.9rem; margin:.7rem 0 .2rem; color:var(--muted); }
input, select, textarea { width:100%; font:inherit; padding:.7rem .75rem; border:1px solid var(--line); border-radius:.6rem; background:#fff; color:var(--text); }
input.big { font-size:2rem; font-weight:600; text-align:center; }
button, .btn { font:inherit; font-weight:600; border:0; border-radius:.7rem; padding:.8rem 1rem; background:var(--brand); color:#fff; width:100%; margin-top:1rem; text-align:center; text-decoration:none; display:block; cursor:pointer; }
button.secondary, .btn.secondary { background:#e6f2f0; color:var(--brand); }
button.small { width:auto; padding:.4rem .8rem; margin:0; font-size:.85rem; }
button:disabled { opacity:.6; }
.err { color:var(--bad); font-size:.9rem; margin:.4rem 0; }
.ok { color:var(--good); font-size:.9rem; margin:.4rem 0; }
.seg { display:flex; gap:.4rem; } .seg button { margin:0; background:#e6f2f0; color:var(--brand); padding:.55rem .3rem; font-size:.9rem; }
.seg button.on { background:var(--brand); color:#fff; }
.share { display:flex; align-items:center; gap:.6rem; margin:.4rem 0; } .share span { flex:1; } .share input { width:8rem; }
.fab { position:fixed; right:1rem; bottom:calc(1rem + env(safe-area-inset-bottom)); width:auto; padding:.9rem 1.2rem; border-radius:2rem; box-shadow:0 4px 14px #0003; margin:0; }
.copy { word-break:break-all; font-size:.8rem; background:#f0f3f2; padding:.5rem; border-radius:.5rem; margin-top:.5rem; }
.spacer { height:5rem; }
.share input[type=checkbox] { width:1.5rem; height:1.5rem; }
#who{white-space:nowrap}
button.danger { background:#fde8e6; color:var(--bad); }
.actions { margin-top:.6rem; justify-content:flex-start; } .actions .btn.small { width:auto; padding:.4rem .8rem; margin:0; font-size:.85rem; }
progress { width:100%; height:.7rem; margin:.5rem 0 .3rem; border:0; border-radius:1rem; overflow:hidden; background:#e6ebe9; accent-color:var(--brand); appearance:none; -webkit-appearance:none; }
progress::-webkit-progress-bar { background:#e6ebe9; }
progress::-webkit-progress-value { background:var(--brand); }
progress::-moz-progress-bar { background:var(--brand); }
.budget.warning { border-color:#d97706; background:#fffbeb; }
.budget.warning progress::-webkit-progress-value { background:#d97706; } .budget.warning progress::-moz-progress-bar { background:#d97706; }
.budget.over { border-color:var(--bad); background:#fef3f2; }
.budget.over progress::-webkit-progress-value { background:var(--bad); } .budget.over progress::-moz-progress-bar { background:var(--bad); }
.alert { font-size:.9rem; font-weight:600; margin:.4rem 0 0; } .alert.warning { color:#b45309; } .alert.over { color:var(--bad); }
.badge.off { background:#f0f0ee; color:var(--muted); }
.btn.disabled, .btn[aria-disabled=true] { opacity:.5; pointer-events:none; }
.actions.wrap { flex-wrap:wrap; gap:.4rem; }
[hidden] { display:none !important; }
.receipt-img { display:block; width:100%; max-height:16rem; object-fit:contain; background:#f0f3f2; border:1px solid var(--line); border-radius:.6rem; margin:.3rem 0; }
.receipt-img.full { max-height:none; }

/* Entrate e uscite */
.badge.in { background:#dcfae6; color:var(--good); }
.seg button.type-expense.on { background:var(--bad); }
.seg button.type-income.on { background:var(--good); }
button.income { background:var(--good); }
.seg.periods { flex-wrap:nowrap; } .seg.periods button { flex:1 1 0; width:auto; min-width:0; padding:.5rem .1rem; font-size:.8rem; }
.pnav { display:flex; align-items:center; justify-content:space-between; gap:.5rem; margin:.6rem 0; }
.pnav .small { width:2.6rem; height:2.4rem; font-size:1.3rem; line-height:1; padding:0; }
.plabel { flex:1; text-align:center; text-transform:capitalize; }
.custom .pair { display:flex; gap:.6rem; } .custom .pair > div { flex:1; } .custom button { margin-top:.7rem; }
.stats .cur { font-weight:700; color:var(--brand); margin-bottom:.4rem; }
.tot { display:grid; grid-template-columns:repeat(3,1fr); gap:.4rem; text-align:center; }
.tot div { display:flex; flex-direction:column; min-width:0; } .tot .amount { font-size:1rem; overflow-wrap:anywhere; white-space:normal; }
h3 { font-size:.95rem; margin:1rem 0 .3rem; }
.chart { width:100%; height:auto; display:block; }
.chart .axis { stroke:var(--line); stroke-width:1; }
.chart .tick { font-size:7px; fill:var(--muted); }
.bar-in { fill:#12b76a; background:#12b76a; } .bar-out { fill:#f04438; background:#f04438; }
.legend-inline { display:flex; gap:1rem; font-size:.8rem; color:var(--muted); }
.dot { display:inline-block; width:.7rem; height:.7rem; border-radius:50%; margin-right:.35rem; vertical-align:middle; }
.donut-wrap { display:flex; flex-direction:column; align-items:center; gap:.6rem; }
.donut { width:11rem; height:11rem; transform:rotate(0); }
.donut-bg { stroke:#edf1f0; } .donut-c { font-size:4.2px; font-weight:700; fill:var(--text); }
.legend { list-style:none; margin:0; padding:0; width:100%; }
.legend li { display:flex; align-items:center; gap:.4rem; padding:.2rem 0; font-size:.9rem; }
.legend .lname { flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; } .legend .pct { width:2.6rem; text-align:right; }
circle.s0,.dot.s0{stroke:#0f766e;background:#0f766e} circle.s1,.dot.s1{stroke:#f79009;background:#f79009} circle.s2,.dot.s2{stroke:#2e90fa;background:#2e90fa}
circle.s3,.dot.s3{stroke:#d444f1;background:#d444f1} circle.s4,.dot.s4{stroke:#f04438;background:#f04438} circle.s5,.dot.s5{stroke:#66c61c;background:#66c61c}
circle.s6,.dot.s6{stroke:#6172f3;background:#6172f3} circle.s7,.dot.s7{stroke:#ee46bc;background:#ee46bc} circle.s8,.dot.s8{stroke:#15b79e;background:#15b79e}
circle.s9,.dot.s9{stroke:#b54708;background:#b54708} circle.s10,.dot.s10{stroke:#7a5af8;background:#7a5af8} circle.s11,.dot.s11{stroke:#98a2b3;background:#98a2b3}
.basis { margin-top:1rem; }
.periodbar { display:flex; justify-content:space-between; align-items:center; gap:.6rem; } .periodbar .btn { margin:0; }
.card.inactive { opacity:.7; }
.editcat { margin-top:.6rem; } .editcat input, .editcat select { margin-bottom:.4rem; }

/* Ricorrenze: interruttore «Ripeti», avviso sul cron, prossime scadenze */
.repeat { margin:1rem 0 .4rem; padding:.7rem .8rem; border:1px dashed #b9d3cf; border-radius:.6rem; background:#f4faf9; }
.switch { display:flex; align-items:center; gap:.6rem; flex-wrap:wrap; margin:0; font-weight:600; cursor:pointer; min-height:2.75rem; }
.switch small { flex-basis:100%; font-weight:400; margin-left:3.4rem; margin-top:-.5rem; }
.switch-input { appearance:none; -webkit-appearance:none; width:2.8rem; height:1.6rem; margin:0; border-radius:1rem; background:#c9d2d0; position:relative; flex:none; transition:background .15s; }
.switch-input::after { content:''; position:absolute; top:.15rem; left:.15rem; width:1.3rem; height:1.3rem; border-radius:50%; background:#fff; box-shadow:0 1px 3px #0004; transition:transform .15s; }
.switch-input:checked { background:var(--brand); } .switch-input:checked::after { transform:translateX(1.2rem); }
.repeat-box[hidden] { display:none; }
.card.notice { font-size:.9rem; } .card.notice p { margin:.3rem 0; }
.card.notice.warn { border-color:#d97706; background:#fffbeb; }
.row.due { align-items:flex-start; margin:.35rem 0; } .block { display:block; }
code { background:#eef2f1; padding:.05rem .3rem; border-radius:.25rem; font-size:.85em; word-break:break-all; }
/* Statistiche del capitolo */
.cattable { width:100%; border-collapse:collapse; font-size:.92rem; margin-top:.4rem; }
.cattable th, .cattable td { padding:.5rem .3rem; border-bottom:1px solid var(--line); text-align:left; vertical-align:top; }
.cattable thead th { font-size:.78rem; font-weight:600; color:var(--muted); }
.cattable th.num, .cattable td.num { text-align:right; white-space:nowrap; }
.cattable tbody tr { cursor:pointer; } .cattable tbody tr.sel { background:#e6f2f0; box-shadow:inset .25rem 0 0 var(--brand); }
.cattable tbody th { font-weight:600; overflow-wrap:anywhere; } .cattable tfoot th, .cattable tfoot td { border-bottom:0; font-weight:700; }
.cattable .amount { font-size:.92rem; } .cattable .block { font-size:.78rem; }
button.linkish { display:inline; width:auto; margin:0; padding:0; background:none; color:var(--text); font-weight:600; text-align:left; border-radius:0; text-decoration:underline dotted var(--brand); text-underline-offset:.2em; }
.sorter { align-items:center; } .sorter .seg { flex:1; max-width:15rem; } .sorter .seg button { padding:.4rem .3rem; font-size:.82rem; }
.row.person { align-items:flex-start; margin:.4rem 0; } .row.person .right { text-align:right; }
#movimenti { scroll-margin-top:5rem; }
.pair > div { min-width:0; } .pair input[type=date] { min-width:0; }
/* Conferme e avvisi dentro la pagina (al posto di alert/confirm: in una PWA su iPhone possono non comparire) */
body.modal-open { overflow:hidden; }
.modal-back { position:fixed; inset:0; z-index:50; background:#0a1412aa; display:flex; align-items:flex-end; justify-content:center; padding:1rem; padding-bottom:calc(1rem + env(safe-area-inset-bottom)); overflow-y:auto; }
.modal { background:var(--card); border-radius:1rem; padding:1.1rem 1.1rem 1rem; width:100%; max-width:30rem; box-shadow:0 10px 40px #0006; outline:none; margin:auto 0 0; }
.modal h2 { margin:0 0 .5rem; font-size:1.15rem; } .modal p { margin:.3rem 0; overflow-wrap:anywhere; }
.modal input { margin-top:.2rem; }
.modal-actions { display:flex; gap:.6rem; margin-top:1rem; } .modal-actions button { margin:0; flex:1; min-height:2.9rem; }
.modal button.danger { background:var(--bad); color:#fff; } .modal button:disabled { opacity:.45; }
@media (min-width:600px) { .modal-back { align-items:center; } .modal { margin:auto; } }
#toasts { position:fixed; left:0; right:0; z-index:60; top:calc(.6rem + env(safe-area-inset-top)); display:flex; flex-direction:column; gap:.4rem; align-items:center; padding:0 .8rem; pointer-events:none; }
.toast { pointer-events:auto; display:flex; align-items:flex-start; gap:.6rem; max-width:32rem; width:100%; margin:0; padding:.7rem .9rem; border-radius:.8rem; font-size:.95rem; line-height:1.3; color:#fff; box-shadow:0 6px 24px #0004; }
.toast.ok { background:var(--good); } .toast.err { background:var(--bad); }
.toast span { flex:1; overflow-wrap:anywhere; }
.toast .toast-x { width:auto; margin:0; padding:0 .3rem; background:transparent; color:#fff; font-size:1.3rem; line-height:1; }
/* Capitoli preferiti: stella personale (area di tocco 48×48), elenco con preferiti in cima, scorciatoie */
.sr-only { position:absolute; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap; border:0; }
button.star { width:3rem; height:3rem; min-width:3rem; margin:0; padding:0; flex:none; display:inline-flex; align-items:center; justify-content:center; border-radius:50%; background:transparent; color:#8a9692; font-size:1.65rem; line-height:1; font-weight:400; -webkit-tap-highlight-color:transparent; touch-action:manipulation; }
button.star.on { color:#c98a00; }
button.star:active { background:#eef3f2; }
button.star:focus-visible { outline:3px solid var(--brand); outline-offset:-3px; }
.card.chap { display:flex; align-items:center; gap:.2rem; padding:0 .3rem 0 0; }
.card.chap.fav { border-color:#ecd28f; }
.chap-link { flex:1; min-width:0; display:block; padding:.9rem 0 .9rem 1rem; color:inherit; text-decoration:none; }
.titlerow { display:flex; align-items:center; justify-content:space-between; gap:.4rem; } .titlerow h1 { margin-bottom:.4rem; min-width:0; overflow-wrap:anywhere; }
.favstrip { display:flex; gap:.5rem; overflow-x:auto; padding:.1rem 0 .5rem; margin-bottom:.4rem; -webkit-overflow-scrolling:touch; scrollbar-width:none; }
.chip { flex:none; display:inline-flex; align-items:center; min-height:2.75rem; padding:.4rem .9rem; border-radius:1.4rem; background:#fff7e0; border:1px solid #ecd28f; color:var(--text); font-weight:600; text-decoration:none; white-space:nowrap; max-width:16rem; overflow:hidden; text-overflow:ellipsis; }
.chip span { color:#c98a00; margin-right:.35rem; }
.favmark { color:#c98a00; }
/* Inserimento lampo: pulsante «+» flottante e modulo rapido pensato per il pollice */
.fab-plus { width:3.6rem; height:3.6rem; padding:0; border-radius:50%; display:flex; align-items:center; justify-content:center; font-size:2.2rem; font-weight:400; line-height:1; z-index:20; -webkit-tap-highlight-color:transparent; }
.fab-plus span { margin-top:-.15rem; }
.fab-plus:focus-visible { outline:3px solid #f5b400; outline-offset:2px; }
.qhead { display:flex; align-items:center; gap:.7rem; margin-bottom:.4rem; } .qhead h1 { margin:0; font-size:1.25rem; } .qhead button { min-height:2.75rem; }
.quick .seg { margin-top:.8rem; } .quick .seg button { min-height:3rem; font-size:1rem; }
.qamount-wrap { position:relative; }
input.qamount { font-size:2.6rem; padding:.6rem 3.6rem; min-height:4.4rem; }
.qcur { position:absolute; right:.9rem; top:50%; transform:translateY(-50%); color:var(--muted); font-weight:600; pointer-events:none; }
.qchips { display:flex; flex-wrap:wrap; gap:.45rem; margin:.5rem 0 .2rem; }
.qchip { width:auto; margin:0; min-height:2.75rem; padding:.45rem .9rem; border-radius:1.4rem; background:#fff; color:var(--text); border:1px solid var(--line); font-weight:600; font-size:.95rem; max-width:100%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; touch-action:manipulation; }
.qchip.on { background:var(--brand); border-color:var(--brand); color:#fff; }
.qsugg .qchip { font-weight:400; background:#f4faf9; border-style:dashed; }
.quick select { margin-top:.3rem; }
.qdays button { flex:1; }
.quick input[type=date] { margin-top:.4rem; }
button.qsave { min-height:3.4rem; font-size:1.1rem; margin-top:1.1rem; }
button.qmore { margin-top:.6rem; font-weight:500; font-size:.95rem; }
.toast-act { width:auto; margin:0; padding:.35rem .8rem; background:#fff; color:var(--good); border-radius:.5rem; font-size:.95rem; min-height:2.5rem; }
.toast { align-items:center; }
/* Spese detraibili (730) */
.badge.ded { background:#eef0ff; color:#3538cd; }
.badge.warn { background:#fef0c7; color:#93370d; }
.ded-box { margin:.9rem 0 .2rem; padding:.6rem .8rem; border:1px solid var(--line); border-radius:.6rem; background:#fafcfb; }
.ded-sum { margin-left:.35rem; font-weight:400; }
.ded-box summary { font-weight:600; cursor:pointer; min-height:2.2rem; display:flex; align-items:center; }
.ded-total .big-amount { font-size:1.5rem; }
a.card.ded-row { display:block; } a.card.ded-row.missing { border-color:#f5c26b; }
.plabel .block { font-size:.75rem; text-transform:none; }
/* Ricerca e filtri */
.searchbtn { width:auto; margin:0; white-space:nowrap; min-height:2.75rem; display:inline-flex; align-items:center; }
.ssearch input { font-size:1.1rem; min-height:3rem; }
.schips { margin:.6rem 0; }
.schip .x { margin-left:.45rem; font-size:1.15rem; line-height:1; }
.sfilters summary { font-weight:600; cursor:pointer; min-height:2.4rem; display:flex; align-items:center; justify-content:space-between; list-style:none; }
.sfilters summary::-webkit-details-marker { display:none; }
.sfilters summary::after { content:"Apri ▾"; font-weight:400; color:var(--muted, #667); font-size:.9rem; }
.sfilters[open] summary::after { content:"Chiudi ▴"; }
.sfilters .seg button { min-height:2.75rem; }
.sfilters .pair { display:flex; gap:.6rem; } .sfilters .pair > div { flex:1; }
a.card.srow { display:block; }
.small-btn { margin-top:.6rem; }
/* Previsione di fine mese */
.fc h3 { margin:0; }
.fc-main { display:flex; justify-content:space-between; align-items:baseline; margin-top:.6rem; }
.fc-main strong { font-size:1.6rem; }
.fc-range-t { margin:.1rem 0 .4rem; text-align:right; }
.fc-chart { margin-top:.5rem; }
.fc-chart .fc-real { fill:none; stroke:var(--brand); stroke-width:2.4; stroke-linejoin:round; stroke-linecap:round; }
.fc-chart .fc-next { fill:none; stroke:var(--brand); stroke-width:2.2; stroke-dasharray:5 4; opacity:.75; }
.fc-chart .fc-range { stroke:var(--muted); stroke-width:1.4; }
.fc-chart .fc-zero { stroke:var(--bad); stroke-width:1; stroke-dasharray:2 3; opacity:.7; }
.fc-chart .fc-dot { fill:var(--brand); stroke:#fff; stroke-width:1.5; }
.fc-key { display:inline-block; width:1.4rem; height:0; border-top:2.5px solid var(--brand); vertical-align:middle; margin-right:.35rem; }
.fc-key.next { border-top-style:dashed; opacity:.75; }
.fc-warn { margin:.5rem 0; padding:.55rem .7rem; border-radius:.6rem; background:#fffbeb; border:1px solid #f5c26b; color:#7a2e0e; font-size:.92rem; }
.fc-warn.bad { background:#fef3f2; border-color:#f4a69e; color:var(--bad); }
.fc-why { margin-top:.6rem; }
.fc-why summary { cursor:pointer; color:var(--brand); font-weight:600; min-height:2.75rem; display:flex; align-items:center; }
.fc-line { padding:.25rem 0; border-bottom:1px solid var(--line); gap:.8rem; }
.fc-line.fc-total { font-weight:700; border-bottom:none; }
.fc-list { margin:.2rem 0 .4rem 1rem; padding:0; font-size:.88rem; }
.fc-box { margin:.6rem 0; }
.fc-sub { margin:.15rem 0 0; }
