@font-face{font-family:Golos;font-display:swap;src:url('/fonts/golos-400.ttf')}@font-face{font-family:Golos;font-display:swap;src:url('/fonts/golos-500.ttf');font-weight:500}@font-face{font-family:Golos;font-display:swap;src:url('/fonts/golos-600.ttf');font-weight:600}@font-face{font-family:Literata;font-display:swap;src:url('/fonts/literata-400.ttf')}@font-face{font-family:Literata;font-display:swap;src:url('/fonts/literata-500.ttf');font-weight:500}
:root{--paper:#fbf8f1;--surface:#ecefe6;--ink:#2e352f;--muted:#646e65;--line:#d7dccf;--green:#41634f;--red:#a64031;--red-bg:#f2ded4;--ochre:#805a1d;--radius:8px;--heading:Literata,Georgia,serif;font:15px/1.47 Golos,sans-serif;color:var(--ink);background:#e8e9e1;color-scheme:light}
*{box-sizing:border-box}body{margin:0}button,input,select,textarea{font:inherit;color:inherit}button,a,input,select,textarea{-webkit-tap-highlight-color:transparent}button{cursor:pointer;border:0;background:none}button:disabled{cursor:default;opacity:.4}a{color:inherit}button:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible{outline:2px solid var(--green);outline-offset:3px}h1,h2,h3,p{margin:0}h1,h2,h3{font-family:var(--heading);font-weight:400}h1{font-size:28px;line-height:36px;letter-spacing:-.3px}h2{font-size:23px;line-height:30px}h3{font-size:18px;line-height:25px}strong{font-weight:500}small,.caption{font-size:13px;line-height:18px}.muted{color:var(--muted)}.green{color:var(--green)}.red{color:var(--red)}.ochre{color:var(--ochre)}.num{font-variant-numeric:tabular-nums}.hidden,[hidden]{display:none!important}.stack{display:flex;flex-direction:column;gap:12px}.row{display:flex;align-items:center;gap:12px}.between{justify-content:space-between}.grow{flex:1;min-width:0}.right{text-align:right}.spacer{flex:1}.gap24{gap:24px}.mt16{margin-top:16px}.mt24{margin-top:24px}.mb12{margin-bottom:12px}.nowrap{white-space:nowrap}
.shell{max-width:480px;margin:0 auto;min-height:100dvh;background:var(--paper);position:relative;box-shadow:0 0 0 1px #d7dccf}.page{padding:20px 24px calc(160px + env(safe-area-inset-bottom));min-height:100dvh}.page.no-add{padding-bottom:96px}.page-head{display:flex;align-items:center;justify-content:space-between;gap:10px;min-height:44px;margin-bottom:14px;padding-bottom:12px;border-bottom:1px solid var(--line)}.profile{font-size:13px;padding:6px 8px;min-height:44px;border:1px solid var(--line);border-radius:8px;background:transparent;max-width:105px}.scope{display:flex;min-height:44px;background:var(--surface);border:1px solid var(--line);border-radius:8px;overflow:hidden;margin-bottom:12px}.scope button{flex:1;font-weight:500;min-height:44px}.scope button.active{background:var(--green);color:var(--paper)}.month{display:flex;gap:4px;align-items:center;margin-bottom:20px}.month button{min-width:44px;min-height:44px;border-radius:8px;background:var(--surface);display:flex;align-items:center;justify-content:center}.month .choose{flex:1;gap:8px;font:23px/30px var(--heading)}.month .choose span{flex:1}.month img{display:block}.hero{font:48px/1.3 var(--heading);letter-spacing:-1px;overflow-wrap:anywhere}.hero.medium{font-size:36px;line-height:48px}.hero-caption{font-size:13px;color:var(--muted);margin-bottom:4px}.summary{display:flex;gap:16px;margin:18px 0}.summary>div{flex:1;min-width:0}.summary strong{display:block;margin-top:5px}.notice{padding:12px;border-radius:8px;background:var(--surface);font-size:13px;line-height:19px}.notice.danger{background:var(--red-bg);color:var(--red)}.notice button{min-height:44px;text-align:left;text-decoration:underline;text-underline-offset:3px;padding:6px 0}.notice strong{font-weight:500}.link{min-height:44px;text-decoration:underline;text-underline-offset:4px;color:var(--green);padding:8px 0;text-align:left}.primary,.secondary{min-height:48px;border-radius:8px;padding:10px 16px;font-weight:500;display:flex;align-items:center;justify-content:center;gap:8px;text-decoration:none}.primary{background:var(--green);color:var(--paper)}.primary:hover{background:#304c3b}.secondary{border:1px solid var(--line);background:transparent}.secondary:hover{background:var(--surface)}.primary.full,.secondary.full{width:100%}.danger-button{color:var(--red);min-height:44px;text-decoration:underline;text-underline-offset:3px}.empty{padding:24px 0;text-align:left;display:flex;flex-direction:column;gap:12px}.empty p{color:var(--muted);font-size:14px;max-width:34ch}.empty-icon{width:52px;height:52px;background:var(--surface);border-radius:50%;display:grid;place-items:center;margin-bottom:4px}.section-title{display:flex;align-items:center;justify-content:space-between;gap:8px;margin:22px 0 6px}.count{font-size:13px;color:var(--muted)}
.dock{position:fixed;z-index:10;bottom:0;left:50%;transform:translateX(-50%);width:min(100%,480px);padding:10px 24px calc(12px + env(safe-area-inset-bottom));background:var(--paper);border-top:1px solid var(--line)}.dock .primary{margin-bottom:8px}.nav{display:flex;gap:2px}.nav a{min-height:44px;flex:1;display:flex;align-items:center;justify-content:center;text-decoration:none;font-size:12px;color:var(--muted);position:relative;border-radius:8px;white-space:nowrap}.nav a.active{background:var(--surface);color:var(--green);font-weight:500}.nav a.active:after{content:'';position:absolute;bottom:5px;left:20%;right:20%;height:2px;background:var(--green)}
.donut{width:176px;height:176px;margin:8px auto 20px;position:relative;isolation:isolate;border-radius:50%;background:var(--line)}.donut:before{content:'';position:absolute;inset:21px;background:var(--paper);border-radius:50%;z-index:-1}.donut-value{position:absolute;inset:0;display:flex;flex-direction:column;justify-content:center;align-items:center;gap:4px}.donut-value strong{font:32px/42px var(--heading);letter-spacing:-.8px}.donut-value strong.long{font-size:24px}.donut.empty-donut{height:74px;width:100%;margin:8px 0 14px;background:none;border-radius:0}.donut.empty-donut:before{display:none}.donut.empty-donut .donut-value{align-items:flex-start}.donut.empty-donut .donut-value strong{font-size:48px;line-height:56px}.dot{display:block;width:8px;height:8px;border-radius:50%;flex:none}.data-row{display:flex;align-items:center;gap:8px;min-height:72px;padding:12px 0;border-bottom:1px solid var(--line);width:100%;text-align:left}.data-row .description{flex:1;min-width:0;display:flex;flex-direction:column;gap:4px}.data-row .description>strong{overflow-wrap:anywhere}.data-row .description>small{color:var(--muted);font-size:13px;line-height:18px}.data-row .amount{flex:none;text-align:right;font-weight:500;display:flex;flex-direction:column;gap:2px;max-width:48%;font-variant-numeric:tabular-nums}.data-row .amount small{font-weight:400}.chevron{flex:none;display:grid;place-items:center;width:18px}.data-row .amount .value{white-space:nowrap}.mini-bar{height:5px;border-radius:4px;background:var(--surface);overflow:hidden;margin:12px 0}.mini-bar span{display:block;height:100%;background:var(--ink);max-width:100%}.mini-bar.over span{background:var(--red)}.date-group{font-size:13px;color:var(--muted);font-weight:500;margin-top:22px;margin-bottom:2px}.record-row .amount{max-width:42%}.record-row .description strong{font-size:15px}.search{display:flex;align-items:center;gap:10px;min-height:44px;padding:0 10px;border:1px solid var(--line);border-radius:8px}.search input{border:0;background:none;width:100%;min-width:0;outline:none;min-height:42px}.filters{display:flex;gap:8px;flex-wrap:wrap;align-items:center}.filter{border:1px solid var(--line);border-radius:8px;min-height:40px;padding:7px 10px;max-width:100%;background:transparent}.chip{background:var(--surface);border-radius:8px;padding:8px 12px;min-height:40px;display:flex;gap:8px;align-items:center;font-size:13px}.chart{width:100%;height:150px;overflow:visible;color:var(--ink)}.chart text{font:11px Golos;fill:var(--muted)}.insight{border-top:1px solid var(--ink);border-bottom:1px solid var(--line);padding:14px 0;margin:20px 0}.insight h2{font-size:23px}.insight .driver{margin:8px 0;font-size:13px}.month-grid{display:grid;grid-template-columns:1fr 1fr;gap:6px}.month-grid button{min-height:48px;text-transform:capitalize;border:1px solid var(--line);border-radius:8px}.month-grid button.active{background:var(--green);color:var(--paper)}
dialog{padding:0;border:0;background:var(--paper);color:var(--ink);width:min(100%,480px);height:100dvh;max-height:100dvh;max-width:480px;margin:0 auto;inset:0;overflow:hidden}dialog::backdrop{background:rgba(46,53,47,.28)}.sheet{height:100%;display:flex;flex-direction:column;padding:16px 24px 0;gap:12px}.sheet-top{display:flex;flex-direction:column;gap:12px;flex:none}.back{min-height:44px;text-align:left;font-size:13px;padding:0}.sheet-body{min-height:0;flex:1;overflow:auto;padding-bottom:16px;scrollbar-width:thin}.sheet-actions{flex:none;padding:10px 0 calc(16px + env(safe-area-inset-bottom));border-top:1px solid var(--line);background:var(--paper)}.sheet-actions .primary{width:100%}.amount-input{display:flex;align-items:baseline;gap:6px;font:48px/64px var(--heading);border-bottom:1px solid var(--line);padding-bottom:4px}.amount-input input{font:inherit;width:100%;min-width:0;background:transparent;border:0;outline:0;padding:0;color:var(--ink)}.amount-input:focus-within{border-bottom-color:var(--green)}.field{display:flex;align-items:center;min-height:52px;gap:10px;width:100%;text-align:left}.field>span:first-child,.field>label:first-child{font-size:13px;color:var(--muted);flex:0 0 96px}.field>select,.field>input,.field>strong{min-width:0;flex:1;border:0;background:transparent;min-height:44px;padding:6px 0}.field select{appearance:auto}.field.category{background:var(--surface);border:1px solid var(--line);border-radius:8px;padding:0 12px;min-height:48px}.field.category strong{font-weight:500}.comment{display:flex;flex-direction:column;gap:4px;padding:12px;border:1px solid var(--line);border-radius:8px;margin-top:12px}.comment label{font-size:13px;color:var(--muted)}textarea{border:0;background:transparent;resize:vertical;min-height:54px;width:100%;outline:0}.form-note{font-size:13px;color:var(--muted);margin:8px 0 12px}.form-error:empty{display:none}.form-error{color:var(--red);background:var(--red-bg);padding:12px;border-radius:8px;font-size:13px;line-height:19px}.type-picker{display:flex;gap:8px}.type-picker button{min-height:36px;padding:6px 12px;border-radius:8px;border:1px solid var(--line);font-size:13px}.type-picker button.active{background:var(--surface);font-weight:500}.frequent-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px}.frequent-grid button{min-height:88px;display:flex;align-items:center;justify-content:center;flex-direction:column;gap:8px;border-radius:8px;font-size:13px;line-height:18px}.frequent-grid button:hover{background:var(--surface)}.frequent-grid .icon-slot{width:26px;height:26px;display:grid;place-items:center}.frequent-grid small{font-size:11px;color:var(--muted)}.category-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));column-gap:12px}.category-grid button{min-height:52px;padding:4px 0;display:flex;gap:8px;align-items:center;text-align:left;font-size:13px;line-height:18px}.category-grid button span{flex:1;min-width:0}.category-grid img{flex:none}.picker-list button{display:flex;align-items:center;gap:10px;min-height:54px;border-bottom:1px solid var(--line);text-align:left;width:100%}.picker-list button span{flex:1}.limit-row{display:flex;gap:10px;align-items:center;min-height:78px;border-bottom:1px solid var(--line)}.limit-row label{flex:1;display:flex;gap:10px;align-items:center;min-width:0;font-size:14px;min-height:52px}.limit-row input[type=checkbox]{width:18px;height:18px;accent-color:var(--green);flex:none}.limit-row input[type=text]{width:112px;min-height:44px;border:1px solid var(--line);border-radius:8px;background:transparent;padding:8px 10px;text-align:right;font-variant-numeric:tabular-nums}.limit-row input:disabled{opacity:.4}.limit-row label span{overflow-wrap:anywhere}.settings-plan{font-size:13px;display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}.settings-plan strong{font-size:18px}.member{padding:16px 0;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:12px}.avatar{width:40px;height:40px;background:var(--surface);border-radius:50%;display:grid;place-items:center;font:20px var(--heading)}.review-row{display:flex;gap:10px;align-items:center;border-bottom:1px solid var(--line)}.review-row input{accent-color:var(--green);height:20px;width:20px;flex:none}.review-row .data-row{border:0}.review-actions{position:sticky;bottom:0;background:var(--paper);padding:10px 0;border-top:1px solid var(--line);display:flex;gap:6px;flex-wrap:wrap}.review-actions button{flex:1;padding:10px;font-size:13px}.review-check{display:flex;align-items:center;gap:10px;min-height:44px;font-size:13px}.review-check input{accent-color:var(--green);width:18px;height:18px}.badge{font-size:11px;line-height:16px;padding:2px 6px;background:var(--surface);border-radius:4px;display:inline-flex;width:fit-content}.tools{margin-top:18px;display:flex;flex-direction:column;gap:6px}.tools button{justify-content:flex-start;text-align:left}.file-button input{max-width:100%;display:block;margin-top:8px;font-size:13px}.boot{padding:30px;font-family:var(--heading)}#toast{position:fixed;z-index:30;bottom:calc(158px + env(safe-area-inset-bottom));left:50%;transform:translateX(-50%);max-width:calc(100% - 32px);width:400px;padding:12px 16px;border-radius:8px;background:var(--ink);color:var(--paper);font-size:13px;display:none;box-shadow:0 4px 18px #2e352f20}#toast.show{display:flex;align-items:center;gap:12px}#toast span{flex:1}#toast button{color:var(--paper);min-height:32px;text-decoration:underline}.icon-inline{display:inline-block;vertical-align:middle}.loading{opacity:.65;pointer-events:none}.error-page{padding:28px}.privacy{font-size:13px;color:var(--muted);padding:12px 0}.detail-section{border-top:1px solid var(--line);padding-top:14px;margin-top:8px}.date-detail{font-size:14px}.toggle-line{min-height:44px;display:flex;justify-content:space-between;align-items:center;gap:12px}.toggle-line input{accent-color:var(--green)}.scroll-hint{font-size:12px;color:var(--muted)}.active-filter{color:var(--green);font-size:13px}.category-progress{margin:12px 0 18px}.category-progress .row{font-size:13px}.disabled-text{color:var(--muted)}
/* Editorial statistics share the period and scope used by category detail. */
.eyebrow{font-size:12px;line-height:18px;letter-spacing:1.2px;text-transform:uppercase}
.stats-summary{margin:20px 0 22px}
.stats-total{font:48px/1.22 var(--heading);letter-spacing:-1.2px;margin:10px 0 12px;overflow-wrap:anywhere;font-variant-numeric:tabular-nums}
.stats-difference{font:23px/1.3 var(--heading);margin-bottom:8px}
.stats-summary>.caption+.caption{margin-top:3px}
.stats-insight{border-top:1px solid var(--ink);border-bottom:1px solid var(--line);padding:16px 0;margin:20px 0}
.insight-summary{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,1fr);gap:16px}
.insight-summary h2{font-size:24px;line-height:1.22;overflow-wrap:anywhere}
.insight-numbers{border-left:1px solid var(--line);padding-left:14px;min-width:0}
.insight-amount{font:23px/1.3 var(--heading);margin:3px 0 8px;overflow-wrap:anywhere}
.stats-chart{margin:24px 0 14px}
.stats-chart figcaption{display:flex;justify-content:space-between;align-items:center;gap:12px}
.monthly-chart{display:block;height:auto;margin-top:8px;min-height:170px}
.monthly-chart g[role=button]{cursor:pointer;outline:none}
.monthly-chart g[role=button]:focus-visible>circle{stroke:var(--green);stroke-width:5}
.stats-navigation{display:flex;align-items:center;justify-content:space-between;width:100%;min-height:54px;text-align:left;gap:12px;border-top:1px solid var(--line);font:20px/1.3 var(--heading);padding:12px 0}
.stats-navigation.caption{font:13px/18px Golos}
.stats-tabs{display:flex;gap:4px;border-bottom:1px solid var(--line);margin:12px 0}
.stats-tabs button{flex:1;min-height:44px;font-size:13px;border-bottom:2px solid transparent}
.stats-tabs button[aria-current]{border-bottom-color:var(--green);color:var(--green);font-weight:500}
.stats-insight .link{min-height:44px;text-align:left}
.stats-insight>.caption{margin-top:10px}
/* A shared scale: the marker is 100% of this category's own monthly limit. */
.limit-bar{display:block;position:relative;height:16px;width:100%;margin:4px 0;isolation:isolate}
.limit-track,.limit-within,.limit-over{position:absolute;top:3px;height:10px;border-radius:4px}
.limit-track{left:0;width:80%;background:var(--line)}
.limit-within{left:0;background:var(--green)}
.limit-over{left:80%;background:var(--red);border-top-left-radius:0;border-bottom-left-radius:0}
.limit-over.clipped:after{content:'+';position:absolute;right:2px;top:-4px;font-size:12px;line-height:16px;font-weight:600;color:var(--paper)}
.limit-marker{position:absolute;left:calc(80% - 1px);width:2px;top:0;height:16px;background:var(--ink)}
.budget-section-title{gap:12px;align-items:center}
.limit-key{font-size:12px;line-height:18px;display:flex;align-items:center;gap:8px;color:var(--muted);white-space:nowrap}
.limit-key i{height:14px;width:2px;background:var(--ink);display:block}
.budget-row{display:flex;flex-direction:column;gap:4px;width:100%;text-align:left;min-height:84px;padding:12px 0;border-radius:4px}
.budget-row:hover{background:var(--surface)}
.budget-row-top{display:grid;grid-template-columns:minmax(0,1fr) auto 18px;align-items:start;gap:8px;width:100%}
.budget-row-top>strong{font-size:15px;line-height:22px;overflow-wrap:anywhere}
.budget-row-status{font-size:13px;line-height:22px;text-align:right;max-width:190px;font-variant-numeric:tabular-nums}
.budget-row-meta{font-size:13px;line-height:18px;color:var(--muted);font-variant-numeric:tabular-nums}
.category-progress>.limit-bar{margin-bottom:12px}
.picker-label{display:flex;flex-direction:column;gap:2px;min-width:0}
.picker-label>strong{font-weight:400;overflow-wrap:anywhere}
.picker-label>small{font-size:12px;line-height:16px}
.category-grid .chevron{flex:0 0 14px;width:14px}
.category-grid .chevron img{width:14px;height:14px}
.picker-list .chevron{flex:0 0 18px}
.category-grid button{min-height:56px;padding:10px 0}
.picker-list .selected-mark,.category-grid .selected-mark{flex:none}
.frequent-grid button[aria-pressed=true]{background:var(--surface)}
.picker-parent-back{min-height:44px;margin-bottom:8px}
@media(min-width:700px){body{padding:24px 0}.shell{min-height:calc(100dvh - 48px);border-radius:12px}.page{min-height:calc(100dvh - 48px)}.dock{bottom:0;border-radius:0}dialog{height:calc(100dvh - 48px);max-height:1000px;margin:24px auto;border-radius:12px}}@media(max-width:360px){.page{padding-left:16px;padding-right:16px}.dock{padding-left:16px;padding-right:16px}.sheet{padding-left:16px;padding-right:16px}.nav a{font-size:11px}.hero{font-size:42px}.field>span:first-child,.field>label:first-child{flex-basis:84px}.budget-row-status{max-width:152px}}@media(prefers-reduced-motion:reduce){*{animation:none!important;scroll-behavior:auto!important}}
/* Personal sign-in uses the same paper, type and controls as the budget. */
.auth-page{min-height:100dvh;padding:36px 24px calc(32px + env(safe-area-inset-bottom));display:flex;flex-direction:column;gap:20px}
.auth-kicker{font-size:12px;letter-spacing:1.5px;text-transform:uppercase;color:var(--muted);border-bottom:1px solid var(--ink);padding-bottom:16px;margin-bottom:22px}
.auth-page h1{font:36px/1.2 var(--heading);letter-spacing:-.5px}
.auth-intro{font-size:15px;line-height:23px;color:var(--muted);max-width:38ch}
#auth-form{display:flex;flex-direction:column;gap:18px;margin-top:8px}
.auth-field{display:flex;flex-direction:column;gap:8px;font-size:14px;min-width:0}
.auth-field input,.auth-field textarea{border:1px solid var(--line);border-radius:8px;background:transparent;min-height:50px;padding:12px;font:16px/24px Golos;color:var(--ink);width:100%;min-width:0}
.auth-field input:focus,.auth-field textarea:focus{outline:2px solid var(--green);outline-offset:2px}
.auth-field small{font-size:12px;line-height:18px;color:var(--muted)}
.auth-show{display:flex;align-items:center;gap:10px;min-height:44px;font-size:14px;width:fit-content}
.auth-show input{width:18px;height:18px;accent-color:var(--green)}
.auth-help{font-size:13px;line-height:20px;color:var(--muted)}
.auth-help summary{cursor:pointer;min-height:44px;display:flex;align-items:center;text-decoration:underline;text-underline-offset:4px}
.auth-summary{padding:16px;background:var(--surface);border-radius:8px;display:flex;flex-direction:column;gap:8px}
.account-section{border-top:1px solid var(--line);margin-top:28px;padding-top:20px;display:flex;flex-direction:column;gap:14px}
@media(max-width:360px){.auth-page{padding-left:16px;padding-right:16px}.auth-page h1{font-size:32px}}
/* Keep primary actions visible when the visual viewport shrinks for a keyboard. */
dialog{position:fixed;inset:var(--visible-top,0px) 0 auto;height:var(--visible-height,100dvh);max-height:var(--visible-height,100dvh)}
.sheet-scroll{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding-bottom:16px;scroll-padding:16px}
.sheet-scroll>.sheet-body{overflow:visible;flex:none;padding-bottom:0}
.sheet-scroll>.sheet-top{margin-bottom:12px}
.operation-title,.data-row .description>strong,.insight-driver{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;overflow-wrap:anywhere}
.detail-section p,.field>strong{overflow-wrap:anywhere}
.sheet-top .hero{flex:none}
.data-row .amount .value{white-space:normal;overflow-wrap:anywhere}
input,select,textarea{font-size:16px}
.search:focus-within,.comment:focus-within{outline:2px solid var(--green);outline-offset:2px}
.type-picker button{min-height:44px}
.month-grid button[aria-current]{border-color:var(--green);font-weight:500}
@media(min-width:700px){dialog{top:calc(var(--visible-top,0px) + 24px);height:calc(var(--visible-height,100dvh) - 48px);max-height:min(1000px,calc(var(--visible-height,100dvh) - 48px));margin:0 auto}}
/* Import actions must sit above the persistent section navigation. */
.review-actions{bottom:calc(76px + env(safe-area-inset-bottom));z-index:2}
.sheet-scroll{overflow-anchor:none}

/* Keep the frame and navigation anchors stable across section changes. */
html{scrollbar-gutter:stable}
.page-head{min-height:57px}
.nav{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr) minmax(0,1.18fr) minmax(0,1fr) minmax(0,1fr)}
.nav a{min-width:0}
