:root{--bg: #f6f3ee;--panel: #fffdfa;--ink: #2a2724;--ink-soft: #6d675f;--ink-faint: #9c948a;--line: #e4ddd2;--line-strong: #d2c8b8;--accent: #c2643c;--accent-soft: #fbeee7;--olive: #6a7a4d;--olive-soft: #eef2e4;--blue: #3f6b8a;--blue-soft: #e8f0f5;--plum: #7a4f6d;--warn: #b4711c;--warn-soft: #fdf2df;--radius: 12px;--shadow: 0 1px 2px rgba(42, 39, 36, .06), 0 8px 24px -12px rgba(42, 39, 36, .18);--mono: ui-monospace, "SF Mono", Menlo, Consolas, monospace}*{box-sizing:border-box}html,body,#root{height:100%}body{margin:0;background:var(--bg);color:var(--ink);font:15px/1.5 ui-sans-serif,system-ui,-apple-system,Segoe UI,Roboto,sans-serif;-webkit-font-smoothing:antialiased}h1,h2,h3,h4{margin:0;font-weight:650;letter-spacing:-.01em}a{color:inherit}button,input,select,textarea{font:inherit;color:inherit}.app{display:flex;flex-direction:column;min-height:100%}.topbar{position:sticky;top:0;z-index:40;display:flex;align-items:center;gap:20px;padding:12px 24px;background:#fffdfae0;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-bottom:1px solid var(--line)}.brand{display:flex;align-items:baseline;gap:10px}.brand strong{font-size:16px}.brand span{color:var(--ink-faint);font-size:13px}.nav{display:flex;gap:4px;margin-left:auto}.nav a{padding:7px 14px;border-radius:999px;text-decoration:none;color:var(--ink-soft);font-size:14px;font-weight:500;transition:background .15s,color .15s}.nav a:hover{background:var(--line)}.nav a.active{background:var(--ink);color:var(--panel)}.page{flex:1;padding:24px;max-width:1500px;width:100%;margin:0 auto}.page-head{display:flex;align-items:flex-end;gap:16px;flex-wrap:wrap;margin-bottom:20px}.page-head h1{font-size:24px}.page-head p{margin:4px 0 0;color:var(--ink-soft);font-size:14px;max-width:62ch}.page-head .spacer{flex:1}.card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow)}.btn{display:inline-flex;align-items:center;gap:6px;padding:7px 13px;border-radius:8px;border:1px solid var(--line-strong);background:var(--panel);cursor:pointer;font-size:14px;font-weight:500;transition:background .15s,border-color .15s,transform .05s}.btn:hover{background:var(--bg);border-color:var(--ink-faint)}.btn:active{transform:translateY(1px)}.btn:disabled{opacity:.5;cursor:not-allowed}.btn.primary{background:var(--accent);border-color:var(--accent);color:#fff}.btn.primary:hover{background:#ad5733}.btn.ghost{border-color:transparent;background:transparent;color:var(--ink-soft)}.btn.ghost:hover{background:var(--line)}.btn.small{padding:4px 9px;font-size:13px}.btn.danger{color:#a33}input[type=text],input[type=date],input[type=number],select,textarea{padding:7px 10px;border:1px solid var(--line-strong);border-radius:8px;background:var(--panel);width:100%}input:focus,select:focus,textarea:focus{outline:2px solid var(--accent-soft);border-color:var(--accent)}textarea{resize:vertical;line-height:1.45}.chip{display:inline-flex;align-items:center;gap:5px;padding:2px 9px;border-radius:999px;font-size:12px;font-weight:600;background:var(--line);color:var(--ink-soft)}.chip.accent{background:var(--accent-soft);color:var(--accent)}.chip.olive{background:var(--olive-soft);color:var(--olive)}.chip.blue{background:var(--blue-soft);color:var(--blue)}.chip.warn{background:var(--warn-soft);color:var(--warn)}.muted{color:var(--ink-faint)}.row{display:flex;align-items:center;gap:8px}.wrap{flex-wrap:wrap}.grow{flex:1}.banner{padding:10px 14px;border-radius:10px;font-size:14px;background:var(--warn-soft);color:var(--warn);border:1px solid #efdcb4;margin-bottom:16px}.banner.error{background:#fdecea;color:#a3352a;border-color:#f1c9c4}.banner ul{margin:6px 0 0;padding-left:18px}.empty{padding:40px;text-align:center;color:var(--ink-faint)}.grid-scroll{overflow:auto;max-height:calc(100vh - 230px);border-radius:var(--radius)}table.grid{border-collapse:separate;border-spacing:0;font-size:13px}table.grid th,table.grid td{border-bottom:1px solid var(--line);border-right:1px solid var(--line)}table.grid thead th{position:sticky;top:0;z-index:3;background:var(--panel);padding:4px 0;text-align:center;font-weight:600}table.grid thead tr:nth-child(2) th{top:40px;z-index:3}.day-head{min-width:78px}.day-head.weekend{background:var(--blue-soft)}.day-head b{display:block;font-size:12px;text-transform:capitalize}.day-head span{font-size:11px;color:var(--ink-faint);font-weight:500}.slot-head{width:26px;font-size:10px;color:var(--ink-faint);font-weight:700}.slot-head.night{color:var(--plum)}.name-col{position:sticky;left:0;z-index:5;background:var(--panel);width:230px;min-width:230px;text-align:left;padding:2px 10px;border-right:1px solid var(--line-strong)!important;white-space:nowrap}thead .name-col{z-index:6}tr.household-row td{background:var(--bg)}tr.household-row .name-col{background:var(--bg);font-weight:650}.household-actions{display:flex;gap:1px;margin-left:auto;opacity:.25;transition:opacity .15s}tr:hover .household-actions{opacity:1}.household-actions .btn{padding:1px 5px;font-size:11px;line-height:1.3}.person-name{display:flex;align-items:center;gap:6px;min-height:24px}.person-name.child{padding-left:14px;color:var(--ink-soft)}.person-name .dot{width:6px;height:6px;border-radius:50%;background:var(--line-strong)}.person-name.child .dot{background:var(--blue)}td.cell{padding:0;width:26px;height:26px;cursor:pointer;-webkit-user-select:none;user-select:none}td.cell.weekend{background:#3f6b8a0a}td.cell.night{border-right-color:var(--line-strong)}td.cell i{display:block;width:100%;height:100%;background:transparent;transition:background .1s}td.cell.on i{background:var(--olive)}td.cell.on.night i{background:var(--plum)}td.cell:hover i{box-shadow:inset 0 0 0 2px var(--accent)}td.cell.off:hover i{background:var(--accent-soft)}tr.totals td,tr.totals th{position:sticky;z-index:4;height:25px;background:var(--panel);font-variant-numeric:tabular-nums;text-align:center;font-size:12px;font-weight:600;border-top:1px solid var(--line-strong)}tfoot tr:nth-child(1) td,tfoot tr:nth-child(1) th{bottom:50px}tfoot tr:nth-child(2) td,tfoot tr:nth-child(2) th{bottom:25px}tfoot tr:nth-child(3) td,tfoot tr:nth-child(3) th{bottom:0}tr.totals .name-col{z-index:6;text-align:left}tr.totals td span{color:var(--ink-faint);font-weight:500}.days{display:flex;flex-direction:column;gap:16px}.day-card{padding:0;overflow:hidden}.day-card>header{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:12px 18px;border-bottom:1px solid var(--line);background:var(--bg)}.day-card>header h3{font-size:16px;text-transform:capitalize}.day-card.past{opacity:.55}.meals{display:grid;grid-template-columns:1fr 1fr}.meal{padding:16px 18px}.meal+.meal{border-left:1px solid var(--line)}.meal>h4{display:flex;align-items:center;gap:8px;font-size:13px;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-soft);margin-bottom:12px}.field{margin-bottom:10px}.field label{display:block;font-size:11px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--ink-faint);margin-bottom:3px}.duos{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:14px}.duo{padding:10px;border-radius:10px;border:1px solid var(--line);background:var(--bg)}.duo header{display:flex;align-items:center;gap:6px;font-size:12px;font-weight:700;margin-bottom:7px}.duo header .lock{margin-left:auto;cursor:pointer;border:0;background:none;font-size:13px;opacity:.45}.duo header .lock.on{opacity:1}.duo select{margin-bottom:5px;font-size:13px;padding:5px 8px}.duo.locked{border-color:var(--accent);background:var(--accent-soft)}.duo .alert{color:#a3352a;font-size:12px;margin-top:4px}.loads{display:flex;flex-wrap:wrap;gap:6px}.load-pill{display:flex;align-items:center;gap:7px;padding:4px 10px;border-radius:999px;background:var(--panel);border:1px solid var(--line);font-size:13px}.load-pill b{font-variant-numeric:tabular-nums}.load-pill .bar{display:flex;gap:2px}.load-pill .bar i{width:5px;height:12px;border-radius:1px;background:var(--olive)}.load-pill .bar i.v{background:var(--blue)}.runs{display:grid;grid-template-columns:repeat(auto-fill,minmax(330px,1fr));gap:16px;align-items:start}.run{padding:0;overflow:hidden}.run>header{padding:12px 16px;border-bottom:1px solid var(--line);background:var(--bg)}.run>header .row{justify-content:space-between}.run>header h3{font-size:15px}.progress{height:4px;border-radius:999px;background:var(--line);margin-top:8px;overflow:hidden}.progress i{display:block;height:100%;background:var(--olive);transition:width .25s}.cat-head{display:flex;align-items:center;gap:6px;padding:9px 16px 3px;font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-faint)}.item{display:flex;align-items:center;gap:9px;padding:4px 16px}.item:hover{background:var(--bg)}.item input[type=checkbox]{width:15px;height:15px;accent-color:var(--olive);cursor:pointer;flex:none}.item .label{flex:1;cursor:pointer}.item .qty{font-family:var(--mono);font-size:12px;color:var(--ink-soft);white-space:nowrap}.item.done .label,.item.done .qty{text-decoration:line-through;color:var(--ink-faint)}.item .kill{opacity:0;border:0;background:none;cursor:pointer;color:var(--ink-faint)}.item:hover .kill{opacity:1}.item .kill:hover{color:#a33}.add-item{display:flex;gap:6px;padding:10px 16px;border-top:1px solid var(--line)}.households{display:grid;grid-template-columns:repeat(auto-fill,minmax(360px,1fr));gap:16px;align-items:start}.household{padding:14px 16px}.household>header{display:flex;align-items:center;gap:8px;margin-bottom:10px}.household>header input{font-weight:650;border-color:transparent;background:transparent;padding:4px 6px}.household>header input:hover{border-color:var(--line)}.member{display:flex;align-items:center;gap:8px;padding:5px 0;border-top:1px solid var(--line)}.member>input[type=text]{flex:1 1 90px;min-width:0}.member input[type=text]{border-color:transparent;background:transparent;padding:4px 6px}.member input[type=text]:hover{border-color:var(--line)}.member select{width:auto;padding:3px 6px;font-size:12px}.toggle{display:inline-flex;align-items:center;gap:4px;font-size:12px;color:var(--ink-soft);white-space:nowrap;cursor:pointer}.toggle input{accent-color:var(--olive)}@media(max-width:860px){.meals{grid-template-columns:1fr}.meal+.meal{border-left:0;border-top:1px solid var(--line)}.page{padding:16px}.topbar{flex-wrap:wrap;gap:10px}.nav{margin-left:0;width:100%;overflow-x:auto}}.item .label{min-width:0}.item .chip{max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:bottom}.person-name.baby .dot{background:var(--accent)}
