:root{--ink:#1f2b47;--ink-2:#5a6680;--paper:#f5f1e8;--card:#fff;--card-border:#e4ddcc;--rule:#ddd6c6;--neutral:#e6e0d2;--bar:#ede7da;--icon:#4d5873;--accent:#a34630;--on-accent:#fff6ec;--on-accent-2:#f8e4db;--accent-dash:#d98c78;--warn-bg:#fbeae4;--warn-ink:#7a2e1c;--ok:#2e6b4f;--ro-border:#c9c2b1;--sans:"Noto Sans TC", -apple-system, "PingFang TC", sans-serif;--serif:"Noto Serif TC", "Songti TC", serif;--tabbar-h:76px;--actionbar-h:84px;--safe-b:env(safe-area-inset-bottom,0px)}*{box-sizing:border-box}html,body{background:var(--paper);color:var(--ink);font-family:var(--sans);-webkit-text-size-adjust:100%;margin:0}a{color:inherit;text-decoration:none}button,input{font:inherit;color:inherit}button{cursor:pointer}.num{font-variant-numeric:tabular-nums}.app{max-width:480px;min-height:100dvh;margin:0 auto;position:relative}.page{padding:24px 20px calc(var(--tabbar-h) + var(--safe-b) + 24px)}.page.with-actionbar{padding-bottom:calc(var(--actionbar-h) + var(--safe-b) + 24px)}.page.flush{padding-top:0}.eyebrow{letter-spacing:.08em;color:var(--ink-2);font-size:13px;font-weight:700;line-height:18px}.title{font-family:var(--serif);margin:2px 0 0;font-size:28px;font-weight:900;line-height:36px}.subtitle{color:var(--ink-2);margin-top:4px;font-size:15px;line-height:20px}.serif-18{font-family:var(--serif);font-size:18px;font-weight:600;line-height:24px}.hero{font-family:var(--serif);font-variant-numeric:tabular-nums;font-size:44px;font-weight:900;line-height:52px}.hero small{margin-left:4px;font-size:28px}.hero.accent{color:var(--accent)}.hero.ok{color:var(--ok)}.hero-36{font-family:var(--serif);font-variant-numeric:tabular-nums;font-size:36px;font-weight:900;line-height:44px}.hero-36 small{margin-left:4px;font-size:24px}.muted{color:var(--ink-2)}.small{font-size:13px;line-height:18px}.body{font-size:15px;line-height:22px}.row{justify-content:space-between;align-items:center;gap:12px;display:flex}.stack>*+*{margin-top:12px}.card{background:var(--card);border:1px solid var(--card-border);border-radius:10px;padding:14px}.card+.card,.card+.block,.block+.card{margin-top:14px}.block{margin-top:20px}.divider{background:var(--rule);height:1px;margin:12px 0}.dashed{border-top:1.5px dashed var(--rule);margin:12px 0}.progress{height:16px;margin:20px 0 8px;position:relative}.progress .track{background:var(--rule);border-radius:4px;height:8px;position:absolute;top:4px;left:0;right:0}.progress .fill{background:var(--ink);border-radius:4px;height:8px;position:absolute;top:4px;left:0}.progress .dot{background:var(--ink);width:16px;height:16px;box-shadow:0 0 0 3px var(--paper);border-radius:8px;margin-left:-8px;position:absolute;top:0}.progress.reached .fill,.progress.reached .dot{background:var(--ok)}.line{justify-content:space-between;align-items:baseline;padding:10px 0;font-size:15px;display:flex}.line b{font-variant-numeric:tabular-nums;font-size:16px}.line.total{border-top:1px solid var(--rule);margin-top:4px;padding-top:14px;font-weight:700}.line.total b{font-size:20px}.btn{border:0;border-radius:10px;justify-content:center;align-items:center;gap:8px;height:48px;padding:0 18px;font-size:15px;font-weight:700;display:inline-flex}.btn-primary{background:var(--ink);color:var(--paper)}.btn-action{background:var(--accent);color:var(--on-accent)}.btn-secondary{border:1.6px solid var(--ink-2);color:var(--ink);background:0 0}.btn-danger{border:1.6px solid var(--accent);color:var(--accent);background:0 0}.btn-static{background:var(--neutral);color:var(--ink);cursor:default}.btn:disabled{opacity:.6;cursor:default}.btn-block{width:100%}.add-tile{border:1.6px dashed var(--ink-2);border-radius:10px;justify-content:center;align-items:center;gap:10px;height:56px;margin-top:14px;font-size:15px;display:flex}.icon-btn{border:1.6px solid var(--ink);background:0 0;border-radius:22px;justify-content:center;align-items:center;width:44px;height:44px;display:inline-flex}.pill{font-variant-numeric:tabular-nums;white-space:nowrap;border-radius:16px;align-items:center;height:32px;padding:0 14px;font-size:15px;font-weight:700;display:inline-flex}.pill.gap{border:1.5px solid var(--ink)}.pill.reached{background:var(--ink);color:var(--paper)}.pill.missing{border:1.5px dashed var(--ink-2);color:var(--ink-2)}.tag{border:1.5px solid var(--accent);height:22px;color:var(--accent);vertical-align:middle;border-radius:11px;align-items:center;padding:0 8px;font-size:13px;font-weight:700;display:inline-flex}.house-card{display:block}.house-card .head{align-items:center;gap:12px;display:flex}.thumb{background:var(--neutral);width:56px;height:56px;color:var(--icon);border-radius:10px;flex:none;justify-content:center;align-items:center;display:flex;overflow:hidden}.house-card .name{font-family:var(--serif);font-size:18px;font-weight:600;line-height:24px}.house-card .price-label{color:var(--ink-2);font-size:13px}.house-card .price{font-variant-numeric:tabular-nums;font-size:20px;font-weight:700}.house-card.current{background:var(--accent);border-color:var(--accent);color:var(--on-accent)}.house-card.current .muted,.house-card.current .price-label{color:var(--on-accent-2)}.house-card.current .thumb{color:var(--on-accent);background:#fff6ec2e}.house-card.current .dashed{border-color:var(--accent-dash)}.house-card.current .pill.gap{background:var(--on-accent);color:var(--accent);border:0}.house-card.current .pill.reached{background:var(--on-accent);color:var(--ok)}.house-card.current .pill.missing{border-color:var(--on-accent-2);color:var(--on-accent)}.goal-card{background:var(--accent);color:var(--on-accent);border-radius:10px;justify-content:space-between;align-items:center;margin-top:14px;padding:16px 14px;display:flex}.goal-card .muted{color:var(--on-accent-2)}.invite-card{border:1.6px dashed var(--ink-2);border-radius:10px;margin-top:14px;padding:16px 14px;display:block}.avatars{display:flex}.avatar{background:var(--ink);width:28px;height:28px;color:var(--paper);border:2px solid var(--card);border-radius:14px;justify-content:center;align-items:center;font-size:13px;font-weight:700;display:flex}.avatar+.avatar{background:var(--accent);margin-left:-6px}.field{margin-top:16px}.field label{color:var(--ink-2);margin-bottom:6px;font-size:13px;font-weight:700;line-height:18px;display:block}.input{border:1.5px solid var(--ink-2);background:0 0;border-radius:10px;width:100%;height:44px;padding:0 12px;font-size:16px}.input:focus{outline:2px solid var(--ink);outline-offset:1px}.input[readonly]{border:1.5px dashed var(--ro-border);background:var(--bar);color:var(--ink-2)}.field .hint{color:var(--ink-2);margin-top:6px;font-size:13px;line-height:18px}.grid-2{grid-template-columns:1fr 1fr;gap:12px;display:grid}.grid-2 .field{margin-top:16px}.segmented{gap:8px;display:flex}.segmented button{border:1.5px solid var(--ink);background:0 0;border-radius:10px;flex:1;height:44px;font-size:15px;font-weight:700}.segmented button[aria-pressed=true]{background:var(--ink);color:var(--paper)}.textarea{border:1.5px solid var(--ink-2);resize:vertical;width:100%;min-height:96px;color:inherit;background:0 0;border-radius:10px;padding:10px 12px;font-family:inherit;font-size:16px;line-height:22px}.textarea:focus{outline:2px solid var(--ink);outline-offset:1px}.error{color:var(--accent);margin-top:8px;font-size:13px;line-height:18px}.slider{margin-top:18px}.slider .row{font-size:15px}.slider input[type=range]{width:100%;accent-color:var(--ink);margin-top:8px}.thumbs{flex-wrap:wrap;align-items:center;gap:8px;margin-top:4px;display:flex}.thumbs .thumb{width:64px;height:64px;position:relative}.thumb img{object-fit:cover;width:100%;height:100%;display:block}.thumbs .thumb button{width:22px;height:22px;color:var(--paper);background:#1f2b47bf;border:0;border-radius:11px;padding:0;font-size:13px;line-height:22px;position:absolute;top:2px;right:2px}.add-photo{border:1.6px dashed var(--ink-2);width:64px;height:64px;color:var(--ink);background:0 0;border-radius:10px;justify-content:center;align-items:center;display:inline-flex}.tag.neutral{background:var(--bar);color:var(--ink-2);border:0}.tag.ok{color:var(--ok);border:0;gap:4px;padding:0}.tag.ok:before{content:"";background:var(--ok);border-radius:3px;width:6px;height:6px}.tag-btn{cursor:pointer;background:0 0;border:0;padding:0}.confirm-field{margin-top:16px}.confirm-field .head{justify-content:space-between;align-items:center;gap:8px;min-height:24px;display:flex}.confirm-field .head label{font-size:15px;line-height:20px}.confirm-field .input,.confirm-field .segmented{margin-top:4px}.confirm-field .why{color:var(--ink-2);margin-top:6px;font-size:13px;line-height:18px}.status-banner{justify-content:space-between;align-items:center;margin-top:14px;font-size:13px;line-height:18px;display:flex}.banner{background:var(--warn-bg);border:1px solid var(--accent-dash);color:var(--warn-ink);border-radius:10px;padding:12px 14px;font-size:13px;line-height:18px}.photo-empty{background:var(--neutral);height:160px;color:var(--icon);flex-direction:column;justify-content:center;align-items:center;gap:6px;margin:0 -20px;font-size:13px;display:flex}.photo-empty span{color:var(--ink-2)}.carousel{height:200px;margin:0 -20px;position:relative}.carousel .strip{scroll-snap-type:x mandatory;scrollbar-width:none;gap:2px;height:100%;display:flex;overflow-x:auto}.carousel .strip::-webkit-scrollbar{display:none}.carousel .slide{scroll-snap-align:start;background:var(--neutral);border:0;flex:none;width:82%;height:100%;padding:0}.carousel .slide:only-child{width:100%}.carousel .slide img{object-fit:cover;-webkit-touch-callout:none;width:100%;height:100%;display:block}.carousel-manage{background:var(--paper);height:28px;color:var(--ink);border-radius:14px;align-items:center;padding:0 10px;font-size:13px;font-weight:700;display:flex;position:absolute;bottom:8px;left:8px}.carousel-count{background:var(--ink);height:22px;color:var(--paper);border-radius:11px;padding:0 8px;font-size:13px;font-weight:700;line-height:22px;position:absolute;bottom:8px;right:8px}.lightbox{z-index:50;background:#0f1421f0;border:0;justify-content:center;align-items:center;padding:0;display:flex;position:fixed;inset:0}.lightbox img{object-fit:contain;max-width:100%;max-height:100%}.photo-manager{margin-top:16px}.photo-manager .head{justify-content:space-between;align-items:center;height:24px;font-size:15px;display:flex}.photo-grid{flex-wrap:wrap;gap:12px 8px;margin-top:8px;display:flex}.photo-tile{background:var(--neutral);touch-action:manipulation;-webkit-touch-callout:none;-webkit-user-select:none;user-select:none;cursor:grab;border-radius:10px;width:56px;height:56px;position:relative}.photo-tile img{object-fit:cover;pointer-events:none;border-radius:10px;width:100%;height:100%;display:block}.photo-tile.dragging{z-index:2;cursor:grabbing;box-shadow:0 6px 14px #1f2b4747}.photo-tile.pending{cursor:default;animation:1.2s ease-in-out infinite photo-pulse}@keyframes photo-pulse{50%{opacity:.45}}.cover-badge{background:var(--ink);height:16px;color:var(--paper);border-radius:8px;padding:0 5px;font-size:11px;font-weight:700;line-height:16px;position:absolute;bottom:4px;left:4px}.photo-del{background:var(--ink);width:24px;height:24px;color:var(--paper);border:0;border-radius:12px;justify-content:center;align-items:center;padding:0;display:flex;position:absolute;top:-6px;right:-6px}.photo-confirm{color:var(--on-accent);background:#a34630e6;border:0;border-radius:10px;padding:0;font-size:13px;font-weight:700;position:absolute;inset:0}.photo-add{border:1.6px dashed var(--ink-2);width:56px;height:56px;color:var(--ink);background:0 0;border-radius:10px;justify-content:center;align-items:center;display:flex}.backbar{align-items:center;gap:6px;height:52px;margin:0 -4px;font-size:15px;display:flex}.tabbar{height:calc(var(--tabbar-h) + var(--safe-b));padding-bottom:var(--safe-b);background:var(--bar);border-top:1px solid var(--rule);z-index:10;justify-content:center;display:flex;position:fixed;bottom:0;left:0;right:0}.tabbar nav{width:100%;max-width:480px;display:flex}.tabbar a{color:var(--ink-2);flex-direction:column;flex:1;justify-content:center;align-items:center;gap:4px;font-size:13px;display:flex}.tabbar a.active{color:var(--ink);font-weight:700}.actionbar{height:calc(var(--actionbar-h) + var(--safe-b));padding:16px 20px calc(16px + var(--safe-b));background:var(--bar);border-top:1px solid var(--rule);z-index:10;position:fixed;bottom:0;left:0;right:0}.actionbar .inner{gap:12px;max-width:440px;margin:0 auto;display:flex}.actionbar .btn{flex:1}.actionbar .btn.narrow{flex:0 0 38%}.center{flex-direction:column;justify-content:center;min-height:100dvh;padding:24px 20px;display:flex}.empty{text-align:center;padding:40px 12px 8px}.empty .icon{background:var(--neutral);width:72px;height:72px;color:var(--icon);border-radius:36px;justify-content:center;align-items:center;display:inline-flex}.empty h2{font-family:var(--serif);margin:16px 0 8px;font-size:22px;font-weight:600}.status-dot{border-radius:3px;flex:none;width:6px;height:6px;display:inline-block}.status-dot.ok{background:var(--ok)}.status-dot.problem{background:var(--accent)}.sync-status{color:var(--ink-2);align-items:center;gap:6px;font-size:13px;line-height:18px;display:inline-flex}.warn-line{color:var(--accent);align-items:center;gap:6px;margin-top:2px;font-size:13px;font-weight:700;line-height:18px;display:flex}.btn-small{border-radius:8px;height:32px;padding:0 12px;font-size:13px}.banner.with-action{align-items:center;gap:10px;margin-top:12px;display:flex}.banner.with-action .btn{flex:none}.chart-tip{background:var(--card);border:1px solid var(--card-border);white-space:nowrap;pointer-events:none;border-radius:8px;gap:6px;padding:4px 8px;font-size:13px;line-height:18px;display:flex;position:absolute;top:-6px;transform:translate(-50%,-100%);box-shadow:0 2px 6px #1f2b471f}.chart-tip span{color:var(--ink-2)}.sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}
