{"id":8247,"date":"2026-10-20T02:18:12","date_gmt":"2026-10-20T02:18:12","guid":{"rendered":"https:\/\/snugglesouls.com\/?page_id=8247"},"modified":"2026-10-21T04:05:27","modified_gmt":"2026-10-21T04:05:27","slug":"wet-dry-cat-food-calculator","status":"publish","type":"page","link":"https:\/\/snugglesouls.com\/de\/wet-dry-cat-food-calculator\/","title":{"rendered":"Wet &#038; Dry Cat Food Calculator"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"8247\" class=\"elementor elementor-8247 elementor-bc-flex-widget\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4cc1868 e-con-full e-flex e-con e-parent\" data-id=\"4cc1868\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;ekit_has_onepagescroll_dot&quot;:&quot;yes&quot;}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a5e70bc elementor-widget elementor-widget-html\" data-id=\"a5e70bc\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;ekit_we_effect_on&quot;:&quot;none&quot;}\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<style>\n#ss-mixed-tool{--mf-ink:#152d30;--mf-green:#185747;--mf-soft:#edf4f0;--mf-line:#cedbd5;--mf-muted:#47605a;--mf-wet:#1c6a53;--mf-dry:#a8c5b6;--mf-treat:#d5bfa0;max-width:1200px;padding:38px 22px 64px;margin:0 auto;color:var(--mf-ink);font:16px\/1.65 Arial,Helvetica,sans-serif;text-align:left;overflow-wrap:anywhere}\n#ss-mixed-tool *,#ss-mixed-tool *::before,#ss-mixed-tool *::after{box-sizing:border-box}\n#ss-mixed-tool [hidden]{display:none!important}\n#ss-mixed-tool h1,#ss-mixed-tool h2,#ss-mixed-tool h3,#ss-mixed-tool p,#ss-mixed-tool figure{margin:0}\n#ss-mixed-tool h1{font-size:clamp(36px,4.3vw,54px);line-height:1.09;letter-spacing:-1.8px;color:var(--mf-ink);font-weight:750}\n#ss-mixed-tool h2{font-size:29px;line-height:1.2;letter-spacing:-.7px;color:var(--mf-ink);font-weight:700}\n#ss-mixed-tool h3{font-size:19px;line-height:1.35;color:var(--mf-ink);font-weight:700}\n#ss-mixed-tool a{color:var(--mf-green);text-decoration:underline;text-underline-offset:3px}\n#ss-mixed-tool a:hover{text-decoration-thickness:2px}\n#ss-mixed-tool button,#ss-mixed-tool input,#ss-mixed-tool select{font:inherit;letter-spacing:normal;text-transform:none}\n#ss-mixed-tool button{cursor:pointer;border-radius:5px;transition:background .15s;color:var(--mf-ink);box-shadow:none;white-space:normal;line-height:1.25}\n#ss-mixed-tool button:disabled{cursor:not-allowed;opacity:.55}\n#ss-mixed-tool button:active{transform:translateY(1px)}\n#ss-mixed-tool :focus-visible{outline:3px solid #267e67;outline-offset:3px}\n#ss-mixed-tool section[id]{scroll-margin-top:24px}\n#ss-mixed-tool .mf-eyebrow{font-size:11px;font-weight:700;letter-spacing:1.7px;line-height:1.5;color:var(--mf-muted);margin-bottom:13px}\n#ss-mixed-tool .mf-hero{display:grid;grid-template-columns:1.1fr 1fr;gap:42px;align-items:center;padding-bottom:30px}\n#ss-mixed-tool .mf-lead{max-width:440px;font-size:19px;line-height:1.6;margin:20px 0}\n#ss-mixed-tool .mf-jump{display:inline-flex;gap:35px;align-items:center;text-decoration:none;background:var(--mf-green);color:#fff;padding:13px 18px;border-radius:5px;font-weight:700}\n#ss-mixed-tool .mf-jump span{font-size:22px;line-height:1}\n#ss-mixed-tool .mf-hero-note{font-size:12px;margin-top:12px;color:var(--mf-muted)}\n#ss-mixed-tool .mf-hero-photo{min-width:0;align-self:stretch;display:flex;flex-direction:column;justify-content:center}\n#ss-mixed-tool .mf-hero-photo img{width:100%;height:auto;aspect-ratio:1.46;object-fit:cover;display:block;border-radius:6px}\n#ss-mixed-tool figcaption{font-size:12px;color:var(--mf-muted);padding-top:9px;line-height:1.5}\n#ss-mixed-tool .mf-nav{display:flex;gap:14px 24px;flex-wrap:wrap;padding:17px 0;border-top:1px solid var(--mf-line);border-bottom:1px solid var(--mf-line);font-size:13px;font-weight:700}\n#ss-mixed-tool .mf-nav a{color:var(--mf-ink);text-decoration:none}\n#ss-mixed-tool .mf-nav a:hover{text-decoration:underline}\n#ss-mixed-tool .mf-workbench{padding-top:35px}\n#ss-mixed-tool .mf-workbench-heading{display:flex;align-items:center;justify-content:space-between;gap:22px}\n#ss-mixed-tool .mf-workbench-heading .mf-eyebrow{margin-bottom:7px}\n#ss-mixed-tool .mf-secondary{padding:11px 15px;border:1px solid var(--mf-green);background:#fff;color:var(--mf-green);font-weight:700;font-size:14px;flex-shrink:0}\n#ss-mixed-tool .mf-secondary:hover{background:var(--mf-soft)}\n#ss-mixed-tool .mf-scope{max-width:850px;font-size:14px;line-height:1.65;margin:15px 0 25px;color:var(--mf-muted)}\n#ss-mixed-tool .mf-demo-note{padding:13px 16px;background:#fff4d9;color:#573d0c;border-left:3px solid #a57d27;font-size:14px;margin-bottom:22px}\n#ss-mixed-tool .mf-demo-note button{border:0;padding:0;background:none;color:inherit;text-decoration:underline;font-size:14px}\n#ss-mixed-tool .mf-handoff-note{padding:16px 18px;background:var(--mf-soft);border-left:3px solid var(--mf-green);border-radius:0 6px 6px 0;margin:0 0 24px;color:var(--mf-ink)}\n#ss-mixed-tool .mf-handoff-note>strong{display:block;font-size:15px}\n#ss-mixed-tool .mf-handoff-note>p{font-size:14px;line-height:1.6;margin:7px 0 12px}\n#ss-mixed-tool .mf-handoff-note>small{display:block;font-size:12px;line-height:1.55;color:var(--mf-muted)}\n#ss-mixed-tool .mf-handoff-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:10px}\n#ss-mixed-tool .mf-text-button{border:0;background:transparent;color:var(--mf-green);padding:10px 4px;text-decoration:underline;font-size:13px;font-weight:700}\n#ss-mixed-tool .mf-workspace{display:grid;grid-template-columns:minmax(0,1fr) 350px;gap:34px;align-items:start}\n#ss-mixed-tool form{min-width:0;margin:0;padding:0}\n#ss-mixed-tool fieldset{border:0;min-width:0;margin:0;padding:0}\n#ss-mixed-tool .mf-step{padding:0 0 27px;margin-bottom:27px;border-bottom:1px solid var(--mf-line)}\n#ss-mixed-tool legend{font-size:19px;font-weight:700;line-height:1.4;padding:0;margin-bottom:19px;width:100%;color:var(--mf-ink)}\n#ss-mixed-tool legend>span{font-size:12px;display:inline-block;color:var(--mf-muted);border:1px solid var(--mf-line);padding:4px 6px;line-height:1;margin-right:9px;vertical-align:3px;font-variant-numeric:tabular-nums}\n#ss-mixed-tool legend em{display:block;margin-left:40px;font-size:12px;font-style:normal;font-weight:400;color:var(--mf-muted);margin-top:4px}\n#ss-mixed-tool .mf-grid{display:grid;gap:20px}\n#ss-mixed-tool .mf-two{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}\n#ss-mixed-tool .mf-field{min-width:0;margin-bottom:14px}\n#ss-mixed-tool .mf-field:last-child{margin-bottom:0}\n#ss-mixed-tool label{display:block;font-size:13px;font-weight:700;margin-bottom:7px;color:var(--mf-ink);line-height:1.5}\n#ss-mixed-tool label>span{font-weight:400}\n#ss-mixed-tool input:not([type=radio]):not([type=range]),#ss-mixed-tool select{display:block;width:100%;min-width:0;min-height:45px;background:#fff;border:1px solid #80988d;border-radius:5px;color:var(--mf-ink);padding:9px 11px;font-size:16px;line-height:1.5;box-shadow:none;margin:0}\n#ss-mixed-tool select{padding-right:24px}\n#ss-mixed-tool input::placeholder{color:#587066;opacity:1}\n#ss-mixed-tool input[aria-invalid=true]{border:2px solid #9c2721}\n#ss-mixed-tool small{display:block;color:var(--mf-muted);font-size:12px;line-height:1.55;margin-top:6px}\n#ss-mixed-tool .mf-input-unit{position:relative}\n#ss-mixed-tool .mf-input-unit input{padding-right:81px!important}\n#ss-mixed-tool .mf-input-unit>span{position:absolute;right:12px;top:12px;font-size:12px;color:var(--mf-muted);pointer-events:none}\n#ss-mixed-tool .mf-unit-pair{display:grid;grid-template-columns:minmax(0,1fr) 69px;gap:7px}\n#ss-mixed-tool .mf-mode{display:flex;gap:8px 22px;flex-wrap:wrap;margin-bottom:19px}\n#ss-mixed-tool .mf-mode label{display:flex;gap:7px;align-items:flex-start;cursor:pointer;font-size:13px;font-weight:400}\n#ss-mixed-tool input[type=radio]{margin:3px 0 0;accent-color:var(--mf-green);width:16px;height:16px;flex-shrink:0}\n#ss-mixed-tool .mf-ratio-heading{display:flex;align-items:center;justify-content:space-between;gap:15px}\n#ss-mixed-tool .mf-percent{display:flex;gap:6px;align-items:center;flex-shrink:0;width:100px}\n#ss-mixed-tool .mf-percent input{padding:8px!important;text-align:center}\n#ss-mixed-tool input[type=range]{width:100%;accent-color:var(--mf-green);margin:15px 0 6px;display:block;height:22px;cursor:pointer}\n#ss-mixed-tool .mf-range-labels{display:flex;gap:10px;justify-content:space-between;font-size:11px;color:var(--mf-muted);margin-bottom:11px}\n#ss-mixed-tool .mf-range-labels [data-role=ratio-label]{font-weight:700;color:var(--mf-green)}\n#ss-mixed-tool .mf-fieldset-note{font-size:13px;color:var(--mf-muted);margin:-4px 0 20px}\n#ss-mixed-tool .mf-food-lanes{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:23px}\n#ss-mixed-tool .mf-lane-heading{display:flex;gap:10px;align-items:center;border-top:4px solid var(--mf-wet);padding-top:13px;margin-bottom:19px}\n#ss-mixed-tool .mf-dry .mf-lane-heading{border-color:var(--mf-dry)}\n#ss-mixed-tool .mf-lane-heading>span{font-size:12px;font-weight:700;color:var(--mf-muted)}\n#ss-mixed-tool .mf-label-tip{border-top:1px dashed var(--mf-line);padding-top:16px;margin-top:18px;font-size:13px;color:var(--mf-muted)}\n#ss-mixed-tool .mf-label-tip p{margin:7px 0}\n#ss-mixed-tool .mf-label-tip a{font-size:12px}\n#ss-mixed-tool .mf-price-lane h3{font-size:14px;padding:13px 0;border-top:1px solid var(--mf-line);margin:6px 0 10px}\n#ss-mixed-tool details{border-bottom:1px solid var(--mf-line)}\n#ss-mixed-tool summary{cursor:pointer;font-weight:700;line-height:1.5;padding:16px 0;font-size:16px;color:var(--mf-ink)}\n#ss-mixed-tool .mf-household{border:0;border-top:1px dashed var(--mf-line);margin-top:20px;padding-top:2px}\n#ss-mixed-tool .mf-household summary{font-size:13px}\n#ss-mixed-tool .mf-submit-area{margin-top:-4px}\n#ss-mixed-tool .mf-form-actions{display:flex;gap:20px;align-items:center}\n#ss-mixed-tool .mf-primary{border:1px solid var(--mf-green);background:var(--mf-green);color:#fff;font-weight:700;padding:14px 22px;white-space:nowrap}\n#ss-mixed-tool .mf-primary:hover{background:#103e32}\n#ss-mixed-tool .mf-reset{border:0;background:none;padding:10px 0;text-decoration:underline;color:var(--mf-muted);font-size:14px}\n#ss-mixed-tool .mf-submit-area>p{font-size:12px;color:var(--mf-muted);margin-top:12px}\n#ss-mixed-tool .mf-error{color:#8d201c!important;background:#fff1ef;border-left:3px solid #9c2721;padding:12px 14px;margin:0 0 17px!important;font-size:14px!important}\n#ss-mixed-tool .mf-receipt{position:sticky;top:22px;background:var(--mf-ink);color:#fff;padding:24px 23px 20px;border-radius:6px;min-width:0}\n#ss-mixed-tool .mf-receipt:has([data-role=result]:not([hidden])){position:static}\n#ss-mixed-tool .mf-receipt h2{color:#fff;font-size:36px;line-height:1.1;letter-spacing:-.8px;margin:23px 0}\n#ss-mixed-tool .mf-receipt-top{display:flex;justify-content:space-between;gap:10px;color:#d3e5db;font-size:9px;letter-spacing:1px;border-bottom:1px dashed #68847b;padding-bottom:14px}\n#ss-mixed-tool .mf-receipt [data-role=empty]>p{font-size:14px;color:#d3e5db}\n#ss-mixed-tool .mf-receipt ol{padding-left:18px;font-size:13px;line-height:2;margin:20px 0;color:#d3e5db}\n#ss-mixed-tool .mf-empty-equation{display:flex;align-items:center;justify-content:space-between;gap:8px;padding-top:20px;border-top:1px dashed #68847b;font-size:12px}\n#ss-mixed-tool .mf-receipt-caption{color:#d3e5db;font-size:12px}\n#ss-mixed-tool .mf-example-stamp{font-size:11px;background:#304a45;color:#fff2d7;padding:9px;margin-bottom:17px}\n#ss-mixed-tool .mf-calorie-bar{display:flex;border-radius:3px;overflow:hidden;height:11px;margin-top:15px;background:#79978b}\n#ss-mixed-tool .mf-calorie-bar>span:nth-child(1){background:#65bb9b}\n#ss-mixed-tool .mf-calorie-bar>span:nth-child(2){background:#d7e9dc}\n#ss-mixed-tool .mf-calorie-bar>span:nth-child(3){background:#d5bfa0}\n#ss-mixed-tool .mf-bar-key{font-size:11px;color:#d3e5db;line-height:1.8;margin:8px 0 18px}\n#ss-mixed-tool .mf-ticket-item{padding:18px 0;border-top:1px dashed #68847b}\n#ss-mixed-tool .mf-ticket-item>div{display:flex;justify-content:space-between;gap:10px;font-size:13px;align-items:baseline}\n#ss-mixed-tool .mf-ticket-item>div>span{font-size:11px;color:#d3e5db}\n#ss-mixed-tool .mf-ticket-item>b{display:block;font-size:29px;line-height:1.2;letter-spacing:-.5px;margin-top:10px;font-variant-numeric:tabular-nums}\n#ss-mixed-tool .mf-ticket-item small{color:#d3e5db;font-size:12px}\n#ss-mixed-tool .mf-meal-note{font-size:12px;color:#d3e5db;line-height:1.7;margin-bottom:20px}\n#ss-mixed-tool .mf-receipt-divider{border-top:1px dashed #68847b;margin:2px 0 20px}\n#ss-mixed-tool .mf-receipt-eyebrow{font-size:10px;color:#d3e5db;letter-spacing:1px}\n#ss-mixed-tool .mf-spend{display:flex;align-items:baseline;justify-content:space-between;gap:10px;margin-top:9px}\n#ss-mixed-tool .mf-spend>span{font-size:14px}\n#ss-mixed-tool .mf-spend>strong{font-size:29px;letter-spacing:-.6px;font-variant-numeric:tabular-nums;line-height:1.3;text-align:right}\n#ss-mixed-tool .mf-cost-detail{font-size:12px;color:#d3e5db;margin-top:7px}\n#ss-mixed-tool .mf-checkout{background:#27453f;padding:14px;margin:20px 0 17px;border-radius:4px}\n#ss-mixed-tool .mf-checkout>div{display:flex;justify-content:space-between;gap:10px;align-items:baseline}\n#ss-mixed-tool .mf-checkout span{font-size:13px}\n#ss-mixed-tool .mf-checkout strong{font-size:19px;text-align:right}\n#ss-mixed-tool .mf-checkout p{font-size:11px;color:#d3e5db;margin-top:7px}\n#ss-mixed-tool .mf-shopping-list{font-size:12px;color:#e4eee9}\n#ss-mixed-tool .mf-shopping-list p{padding-bottom:12px;line-height:1.7}\n#ss-mixed-tool .mf-price-note{font-size:10px;color:#d3e5db;border-top:1px dashed #68847b;padding-top:14px;line-height:1.65}\n#ss-mixed-tool .mf-warnings p{font-size:11px;border-left:2px solid #d5bfa0;padding-left:10px;margin-top:15px;color:#f9edda}\n#ss-mixed-tool .mf-ticket-actions{display:flex;gap:10px;margin-top:20px}\n#ss-mixed-tool .mf-ticket-actions button{background:#fff;color:#183e32;border:1px solid #fff;padding:9px 11px;font-size:12px;font-weight:700;flex:1}\n#ss-mixed-tool .mf-handoff-action{width:100%;margin-top:11px;padding:11px 13px;border:1px solid rgba(255,255,255,.7);background:transparent;color:#fff;font-size:13px;font-weight:700;text-align:left}\n#ss-mixed-tool .mf-handoff-action:hover{background:rgba(255,255,255,.12)}\n#ss-mixed-tool .mf-status{font-size:11px;color:#d3e5db;margin-top:10px}\n#ss-mixed-tool .mf-section{margin-top:45px;padding-top:32px;border-top:1px solid var(--mf-line)}\n#ss-mixed-tool .mf-section-heading{display:grid;grid-template-columns:1.1fr 1fr;gap:40px;align-items:end;margin-bottom:26px}\n#ss-mixed-tool .mf-section-heading p:not(.mf-eyebrow){font-size:14px;color:var(--mf-muted)}\n#ss-mixed-tool .mf-section-heading .mf-eyebrow{margin-bottom:9px}\n#ss-mixed-tool .mf-comparison-empty{background:var(--mf-soft);padding:24px;font-size:14px;color:var(--mf-muted);border-left:3px solid var(--mf-green)}\n#ss-mixed-tool .mf-table-scroll{overflow:auto;max-width:100%}\n#ss-mixed-tool table{border-collapse:collapse;width:100%;font-size:14px;margin:0;text-align:left;color:var(--mf-ink)}\n#ss-mixed-tool caption{text-align:left;font-weight:700;font-size:14px;line-height:1.5;padding:0 0 15px;color:var(--mf-ink)}\n#ss-mixed-tool th,#ss-mixed-tool td{border:0;border-bottom:1px solid var(--mf-line);padding:15px 12px;text-align:left;vertical-align:middle;font-variant-numeric:tabular-nums}\n#ss-mixed-tool th{font-size:11px;background:var(--mf-soft);font-weight:700;line-height:1.5}\n#ss-mixed-tool td:first-child{font-weight:700}\n#ss-mixed-tool td button{border:1px solid var(--mf-green);background:#fff;color:var(--mf-green);padding:7px 11px;font-size:12px;white-space:nowrap}\n#ss-mixed-tool tr[data-current=true]{background:#f1f7f3}\n#ss-mixed-tool .mf-comparison-note{font-size:12px;color:var(--mf-muted);margin-top:13px}\n#ss-mixed-tool .mf-explainer{display:grid;grid-template-columns:1fr 1fr;gap:40px}\n#ss-mixed-tool .mf-prose p{margin:13px 0;font-size:15px;line-height:1.8}\n#ss-mixed-tool .mf-prose ul{padding-left:20px;margin:13px 0;font-size:15px}\n#ss-mixed-tool .mf-prose li{margin-bottom:9px}\n#ss-mixed-tool .mf-label-sample{background:#fff;border:1px solid #9ab0a5;border-radius:5px;padding:23px 25px;margin-top:23px;font-size:14px}\n#ss-mixed-tool .mf-label-sample h3{font-size:17px}\n#ss-mixed-tool .mf-label-line{display:flex;justify-content:space-between;gap:18px;border-bottom:1px solid var(--mf-line);padding:13px 0;font-variant-numeric:tabular-nums}\n#ss-mixed-tool .mf-label-line strong{text-align:right}\n#ss-mixed-tool .mf-label-sample p{font-size:12px;color:var(--mf-muted);line-height:1.6;margin-top:13px}\n#ss-mixed-tool .mf-example-story{background:var(--mf-soft);padding:30px;display:grid;grid-template-columns:1fr 1fr;gap:35px;border-radius:6px}\n#ss-mixed-tool .mf-example-story h3{font-size:21px;margin-bottom:12px}\n#ss-mixed-tool .mf-example-story p{font-size:14px;line-height:1.8}\n#ss-mixed-tool .mf-example-story b{color:var(--mf-green)}\n#ss-mixed-tool .mf-formula{padding:15px 18px;background:var(--mf-soft);font-size:13px!important;line-height:1.8!important;border-left:3px solid var(--mf-green);font-variant-numeric:tabular-nums;overflow-wrap:anywhere}\n#ss-mixed-tool .mf-link-list{display:grid;grid-template-columns:1fr 1fr;gap:0 35px}\n#ss-mixed-tool .mf-link-list a{display:block;padding:18px 0;border-bottom:1px solid var(--mf-line);text-decoration:none}\n#ss-mixed-tool .mf-link-list strong{font-size:16px;display:block}\n#ss-mixed-tool .mf-link-list span{display:block;font-size:13px;color:var(--mf-muted);margin-top:4px}\n#ss-mixed-tool .mf-faq details>div{padding:0 0 18px;max-width:850px;font-size:15px;line-height:1.8}\n#ss-mixed-tool .mf-faq h2{margin-bottom:20px}\n#ss-mixed-tool .mf-method-notes{font-size:12px;color:var(--mf-muted);line-height:1.8;margin-top:25px}\n#ss-mixed-tool .mf-method-notes h3{font-size:14px;margin-bottom:8px}\n#ss-mixed-tool .mf-method-notes ol{padding-left:20px;margin:10px 0}\n#ss-mixed-tool .mf-method-notes li{margin-bottom:6px}\n@media(min-width:768px) and (max-width:1024px){body:has(#ss-mixed-tool) .elementor-element-dcfe3ff .elementor-button{padding-inline:8px;max-width:100%;box-sizing:border-box}}\n@media(max-width:1024px){#ss-mixed-tool .mf-workspace{grid-template-columns:minmax(0,1fr) 310px;gap:25px}#ss-mixed-tool .mf-food-lanes{gap:17px}#ss-mixed-tool .mf-hero{gap:27px}#ss-mixed-tool h1{font-size:43px}#ss-mixed-tool .mf-receipt{padding:22px 19px}#ss-mixed-tool .mf-workbench-heading h2{font-size:26px}}\n@media(max-width:850px){#ss-mixed-tool .mf-workspace{grid-template-columns:1fr}#ss-mixed-tool .mf-receipt{position:static;padding:26px;max-width:none}#ss-mixed-tool .mf-receipt h2{font-size:32px}#ss-mixed-tool .mf-receipt h2 br{display:none}#ss-mixed-tool .mf-workbench-heading{align-items:flex-start}#ss-mixed-tool .mf-hero{grid-template-columns:1.12fr 1fr}#ss-mixed-tool h1{font-size:36px;letter-spacing:-1.1px}#ss-mixed-tool .mf-lead{font-size:16px;margin:16px 0}#ss-mixed-tool .mf-jump{font-size:14px;gap:16px}#ss-mixed-tool .mf-hero-photo img{aspect-ratio:1;object-position:50% center}#ss-mixed-tool .mf-section-heading,#ss-mixed-tool .mf-explainer{gap:25px}}\n@media(max-width:600px){#ss-mixed-tool{padding:24px 15px 44px}#ss-mixed-tool .mf-hero{grid-template-columns:1fr;gap:23px;padding-bottom:24px}#ss-mixed-tool h1{font-size:40px;letter-spacing:-1.3px}#ss-mixed-tool .mf-hero-photo img{aspect-ratio:1.8;object-position:50% 58%}#ss-mixed-tool .mf-hero-photo figcaption{font-size:11px}#ss-mixed-tool .mf-eyebrow{font-size:10px;letter-spacing:1.25px}#ss-mixed-tool .mf-lead{max-width:350px}#ss-mixed-tool .mf-nav{gap:10px 19px;font-size:12px}#ss-mixed-tool .mf-workbench{padding-top:26px}#ss-mixed-tool .mf-workbench-heading{display:block}#ss-mixed-tool .mf-workbench-heading h2{font-size:26px}#ss-mixed-tool .mf-secondary{margin-top:17px;font-size:13px}#ss-mixed-tool .mf-workspace{gap:28px}#ss-mixed-tool .mf-two{gap:14px}#ss-mixed-tool .mf-mode{display:grid;gap:8px}#ss-mixed-tool .mf-food-lanes{grid-template-columns:1fr;gap:26px}#ss-mixed-tool .mf-food{padding-left:14px;border-left:3px solid var(--mf-wet)}#ss-mixed-tool .mf-dry{border-color:var(--mf-dry)}#ss-mixed-tool .mf-lane-heading{border:0;padding-top:0;margin-bottom:17px}#ss-mixed-tool .mf-food .mf-field{margin-bottom:15px}#ss-mixed-tool .mf-price-lane h3{margin-top:0;padding-top:14px}#ss-mixed-tool .mf-receipt{padding:23px 20px}#ss-mixed-tool legend{font-size:17px}#ss-mixed-tool legend>span{vertical-align:2px}#ss-mixed-tool .mf-section{margin-top:33px;padding-top:26px}#ss-mixed-tool h2{font-size:26px}#ss-mixed-tool .mf-section-heading,#ss-mixed-tool .mf-explainer,#ss-mixed-tool .mf-example-story,#ss-mixed-tool .mf-link-list{grid-template-columns:1fr;gap:20px}#ss-mixed-tool .mf-example-story{padding:22px}#ss-mixed-tool th,#ss-mixed-tool td{padding:12px 10px}#ss-mixed-tool .mf-comparison table{min-width:590px}#ss-mixed-tool .mf-label-sample{padding:18px}#ss-mixed-tool .mf-spend>strong{font-size:27px}#ss-mixed-tool .mf-range-labels{font-size:10px}#ss-mixed-tool .mf-ratio-heading label{max-width:180px}#ss-mixed-tool .mf-household .mf-two{grid-template-columns:1fr}}\n@media(prefers-reduced-motion:reduce){#ss-mixed-tool *{scroll-behavior:auto;transition:none!important}}\n@media print{#ss-mixed-tool .mf-nav,#ss-mixed-tool .mf-hero-photo,#ss-mixed-tool form,#ss-mixed-tool .mf-ticket-actions{display:none}#ss-mixed-tool .mf-workspace{display:block}#ss-mixed-tool .mf-receipt{position:static;print-color-adjust:exact;-webkit-print-color-adjust:exact}}\n\n\n\/* Tool photo banner: owner-approved shared header treatment. *\/\n#ss-mixed-tool header.ss-tool-banner{position:relative;isolation:isolate;display:flex;align-items:center;width:100%;min-height:410px;padding:44px 46px;margin:0 0 26px;border:0;border-radius:10px;overflow:hidden;background:#123f34;color:#fff;text-align:left;box-sizing:border-box}\n#ss-mixed-tool .ss-tool-banner-media{position:absolute;inset:0 0 0 auto;width:76%;z-index:0;pointer-events:none;mask-image:linear-gradient(90deg,transparent,#000 18%)}\n#ss-mixed-tool .ss-tool-banner .ss-tool-banner-media img{display:block;width:100%;height:100%;max-width:none;object-fit:cover;object-position:var(--banner-position,center);border:0;border-radius:0;margin:0;filter:none}\n#ss-mixed-tool header.ss-tool-banner:after{content:'';position:absolute;inset:0;z-index:0;background:linear-gradient(90deg,#123f34 0%,rgba(18,63,52,.98) 23%,rgba(18,63,52,.91) 39%,rgba(18,63,52,.64) 54%,rgba(18,63,52,.16) 76%,rgba(18,63,52,.06) 100%);pointer-events:none}\n#ss-mixed-tool .ss-tool-banner-copy{position:relative;z-index:1;min-width:0;width:100%;max-width:650px}\n#ss-mixed-tool .ss-tool-banner h1{font-family:inherit;color:#fff;font-size:clamp(34px,4.2vw,49px);font-weight:700;line-height:1.15;letter-spacing:-.03em;margin:0;text-wrap:balance;max-width:650px}\n#ss-mixed-tool .ss-tool-banner-copy>p{font-family:inherit;color:#fff;font-size:18px;line-height:1.7;max-width:570px;margin:20px 0 0;text-wrap:pretty}\n#ss-mixed-tool .ss-tool-banner-actions{display:flex;align-items:center;flex-wrap:wrap;gap:12px 16px;margin-top:25px}\n#ss-mixed-tool .ss-tool-banner .ss-tool-banner-actions>:is(a,button){display:inline-flex;align-items:center;justify-content:center;gap:10px;min-height:46px;padding:11px 17px;margin:0;border:1px solid #fff;border-radius:6px;background:transparent;color:#fff;font-family:inherit;font-size:14px;font-weight:600;line-height:1.5;text-align:center;text-decoration:none;box-shadow:none;cursor:pointer}\n#ss-mixed-tool .ss-tool-banner .ss-tool-banner-actions>:first-child{background:#fff;color:#123f34}\n#ss-mixed-tool .ss-tool-banner .ss-tool-banner-actions>:is(a,button):hover{background:#edf5f0;color:#123f34;text-decoration:none}\n#ss-mixed-tool .ss-tool-banner :is(a,button):focus-visible{outline:3px solid #fff;outline-offset:4px}\n#ss-mixed-tool header.ss-tool-banner[data-align=right]{justify-content:flex-end}\n#ss-mixed-tool .ss-tool-banner[data-align=right] .ss-tool-banner-media{inset:0 auto 0 0;mask-image:linear-gradient(270deg,transparent,#000 18%)}\n#ss-mixed-tool header.ss-tool-banner[data-align=right]:after{background:linear-gradient(270deg,#123f34 0%,rgba(18,63,52,.98) 23%,rgba(18,63,52,.91) 39%,rgba(18,63,52,.64) 54%,rgba(18,63,52,.16) 76%,rgba(18,63,52,.06) 100%)}\n@media(max-width:1024px){#ss-mixed-tool header.ss-tool-banner{padding:36px;min-height:390px}#ss-mixed-tool .ss-tool-banner-copy{max-width:610px}#ss-mixed-tool .ss-tool-banner h1{font-size:42px}#ss-mixed-tool .ss-tool-banner-copy>p{max-width:520px}#ss-mixed-tool header.ss-tool-banner:after{background:linear-gradient(90deg,rgba(18,63,52,.98),rgba(18,63,52,.90) 44%,rgba(18,63,52,.32))}#ss-mixed-tool header.ss-tool-banner[data-align=right]:after{background:linear-gradient(270deg,rgba(18,63,52,.98),rgba(18,63,52,.90) 44%,rgba(18,63,52,.32))}}\n@media(max-width:767px){#ss-mixed-tool header.ss-tool-banner{padding:30px 26px;min-height:370px}#ss-mixed-tool .ss-tool-banner .ss-tool-banner-media{width:100%;mask-image:none}#ss-mixed-tool .ss-tool-banner h1{font-size:36px}#ss-mixed-tool .ss-tool-banner-copy>p{font-size:17px}#ss-mixed-tool header.ss-tool-banner:after,#ss-mixed-tool header.ss-tool-banner[data-align=right]:after{background:linear-gradient(90deg,rgba(10,38,29,.88),rgba(10,38,29,.75))}#ss-mixed-tool .ss-tool-banner .ss-tool-banner-media img{object-position:var(--banner-mobile-position,center)}}\n@media(max-width:540px){#ss-mixed-tool header.ss-tool-banner{min-height:360px;padding:28px 22px;border-radius:8px}#ss-mixed-tool .ss-tool-banner h1{font-size:34px;line-height:1.17}#ss-mixed-tool .ss-tool-banner-copy>p{font-size:16px;line-height:1.7;margin-top:18px}#ss-mixed-tool .ss-tool-banner-actions{gap:10px;margin-top:22px}#ss-mixed-tool .ss-tool-banner .ss-tool-banner-actions>:is(a,button){font-size:13px;padding:10px 13px;min-height:45px}}\n\n<\/style>\n<div id=\"ss-mixed-tool\" data-layout=\"feeding-workbench\">\n <header class=\"ss-tool-banner\" data-banner=\"photo-overlay-v1\" data-tool=\"mixed\" data-align=\"left\" style=\"--banner-position:62% 70%;--banner-mobile-position:62% 70%\"><div class=\"ss-tool-banner-media\" aria-hidden=\"true\"><img fetchpriority=\"high\" src=\"https:\/\/snugglesouls.com\/wp-content\/uploads\/2026\/10\/mixed-feeding-workbench.webp\" srcset=\"https:\/\/snugglesouls.com\/wp-content\/uploads\/2026\/10\/mixed-feeding-workbench-768x512.webp 768w, https:\/\/snugglesouls.com\/wp-content\/uploads\/2026\/10\/mixed-feeding-workbench.webp 1536w\" sizes=\"(max-width:767px) 95vw,900px\" width=\"1536\" height=\"1024\" alt=\"\" role=\"presentation\" data-no-lazy=\"1\" loading=\"eager\" fetchpriority=\"high\" decoding=\"async\"><\/div><div class=\"ss-tool-banner-copy\"><h1>Wet &amp; Dry Cat Food Calculator<\/h1><p>Calculate wet and dry cat food portions, compare feeding costs, and plan purchases using your food labels and daily calorie target.<\/p><div class=\"ss-tool-banner-actions\"><a class=\"mf-jump\" href=\"#mf-workbench\">Build your feeding plan <span aria-hidden=\"true\">\u2198<\/span><\/a><\/div><\/div><\/header>\n <nav class=\"mf-nav\" aria-label=\"Mixed feeding page sections\"><a href=\"#mf-workbench\">Portions &amp; cost<\/a><a href=\"#mf-compare\">Compare ratios<\/a><a href=\"#mf-labels\">Read your labels<\/a><a href=\"#mf-method\">How the math works<\/a><a href=\"#mf-faq\">FAQs<\/a><\/nav>\n <section id=\"mf-workbench\" class=\"mf-workbench\" aria-labelledby=\"mf-workbench-title\">\n  <div class=\"mf-workbench-heading\"><div><p class=\"mf-eyebrow\">FROM LABEL TO BOWL<\/p><h2 id=\"mf-workbench-title\">Build one day. Budget the rest.<\/h2><\/div><button type=\"button\" class=\"mf-secondary\" data-action=\"example\">Load an example<\/button><\/div>\n  <p class=\"mf-scope\">Enter a daily calorie target you already use. Need a starting estimate? Open the <a href=\"https:\/\/snugglesouls.com\/cat-calorie-calculator\/\" target=\"_blank\" rel=\"noopener\">cat calorie calculator in a new tab<\/a>, then use its result button to bring the target and compatible label details back here. This worksheet divides that target between foods; it does not set your cat\u2019s calorie needs.<\/p>\n  <div class=\"mf-demo-note\" data-role=\"demo-note\" hidden>Example labels and fictional prices are loaded. Replace every example value with your own before using the plan. <button type=\"button\" data-action=\"reset\">Clear example<\/button><\/div>\n  <div class=\"mf-handoff-note\" data-role=\"handoff-note\" hidden><strong>Values from your calorie plan are ready to review.<\/strong><p data-role=\"handoff-summary\"><\/p><div class=\"mf-handoff-actions\"><button type=\"button\" class=\"mf-secondary\" data-action=\"import-handoff\">Review and add these values<\/button><button type=\"button\" class=\"mf-text-button\" data-action=\"dismiss-handoff\">Keep my current entries<\/button><\/div><small>Only values in this browser tab are transferred. Nothing is added to the page URL. The calculator will not run until you choose \u201cBuild my plan.\u201d<\/small><\/div>\n  <div class=\"mf-workspace\">\n   <form id=\"mf-form\" novalidate>\n    <fieldset class=\"mf-step\"><legend><span>01<\/span> Set the daily calorie budget<\/legend><div class=\"mf-grid mf-two\"><div class=\"mf-field\"><label for=\"mf-target\">Total daily calories, per cat<\/label><div class=\"mf-input-unit\"><input id=\"mf-target\" name=\"target\" type=\"number\" inputmode=\"decimal\" min=\"1\" max=\"10000\" step=\"any\" placeholder=\"e.g. 240\" aria-describedby=\"mf-target-help\"><span>kcal\/day<\/span><\/div><small id=\"mf-target-help\">Include all food and treats in this total.<\/small><small class=\"mf-target-source\" data-role=\"target-source\" hidden><\/small><\/div><div class=\"mf-field\"><label for=\"mf-treats\">Treats &amp; extras<\/label><div class=\"mf-input-unit\"><input id=\"mf-treats\" name=\"treats\" type=\"number\" inputmode=\"decimal\" min=\"0\" step=\"any\" value=\"0\" aria-describedby=\"mf-treats-help\"><span>kcal\/day<\/span><\/div><small id=\"mf-treats-help\">These calories are subtracted before splitting the foods.<\/small><\/div><div class=\"mf-field\"><label for=\"mf-cat-name\">Cat\u2019s name <span>(optional)<\/span><\/label><input id=\"mf-cat-name\" name=\"catName\" type=\"text\" maxlength=\"200\" placeholder=\"Used on a sitter handoff\"><\/div><\/div><\/fieldset>\n    <fieldset class=\"mf-step\"><legend><span>02<\/span> Choose how to mix<\/legend><div class=\"mf-mode\"><label><input type=\"radio\" name=\"mode\" value=\"ratio\" checked> Split by calories<\/label><label><input type=\"radio\" name=\"mode\" value=\"fixed\"> Start with daily cans \/ pouches<\/label><\/div>\n     <div data-mode=\"ratio\"><div class=\"mf-ratio-heading\"><label for=\"mf-share\">Wet-food share of food calories<\/label><div class=\"mf-percent\"><input id=\"mf-share\" name=\"share\" type=\"number\" min=\"0\" max=\"100\" step=\"1\" value=\"50\" aria-describedby=\"mf-share-help\"><span>%<\/span><\/div><\/div><input id=\"mf-slider\" type=\"range\" min=\"0\" max=\"100\" step=\"1\" value=\"50\" aria-label=\"Wet-food calorie percentage slider\"><div class=\"mf-range-labels\"><span>All dry<\/span><span data-role=\"ratio-label\">50% wet \/ 50% dry<\/span><span>All wet<\/span><\/div><small id=\"mf-share-help\">50\/50 means equal calories from the foods, not equal grams or bowl volume. This is a comparison setting, not a recommended ratio.<\/small><\/div>\n     <div data-mode=\"fixed\" hidden><div class=\"mf-field\"><label for=\"mf-fixed\">Wet-food units per cat, per day<\/label><input id=\"mf-fixed\" name=\"fixed\" type=\"number\" inputmode=\"decimal\" min=\"0\" max=\"100\" step=\"any\" placeholder=\"e.g. 1\" disabled aria-describedby=\"mf-fixed-help\"><small id=\"mf-fixed-help\">Use 1 for one can, pouch or tray; 0.5 for half. Dry food fills the remaining food calories.<\/small><\/div><\/div>\n    <\/fieldset>\n    <fieldset class=\"mf-step\"><legend><span>03<\/span> Copy the two food labels<\/legend><p class=\"mf-fieldset-note\">Only a food used in your plan needs a label. Choose the calorie unit exactly as it appears on the package.<\/p>\n     <div class=\"mf-food-lanes\">\n      <section class=\"mf-food mf-wet\" aria-labelledby=\"mf-wet-title\"><div class=\"mf-lane-heading\"><span aria-hidden=\"true\">A<\/span><h3 id=\"mf-wet-title\">Wet food<\/h3><\/div><div class=\"mf-field\"><label for=\"mf-wet-name\">Food name <span>(optional)<\/span><\/label><input id=\"mf-wet-name\" name=\"wetName\" type=\"text\" maxlength=\"200\" placeholder=\"Brand and recipe\"><\/div><div class=\"mf-field\"><label for=\"mf-wet-unit\">One wet-food unit is a<\/label><select id=\"mf-wet-unit\" name=\"wetUnitName\"><option value=\"can\">Can<\/option><option value=\"pouch\">Pouch<\/option><option value=\"tray\">Tray<\/option><option value=\"cup\">Measured cup<\/option><\/select><\/div><div class=\"mf-field\"><label for=\"mf-wet-kcal\">Label calories<\/label><input id=\"mf-wet-kcal\" name=\"wetKcal\" type=\"number\" inputmode=\"decimal\" min=\"0.01\" step=\"any\" placeholder=\"e.g. 100\"><\/div><div class=\"mf-field\"><label for=\"mf-wet-basis\">These calories are per<\/label><select id=\"mf-wet-basis\" name=\"wetBasis\"><option value=\"unit\">One can \/ pouch \/ tray \/ measured cup<\/option><option value=\"100g\">100 g<\/option><option value=\"kg\">kg<\/option><\/select><\/div><div class=\"mf-field\"><label for=\"mf-wet-weight\">Net weight of ONE unit<\/label><div class=\"mf-unit-pair\"><input id=\"mf-wet-weight\" name=\"wetWeight\" type=\"number\" inputmode=\"decimal\" min=\"0.01\" step=\"any\" placeholder=\"e.g. 85\"><select name=\"wetWeightUnit\" aria-label=\"Wet-food unit weight measurement\"><option value=\"g\">g<\/option><option value=\"oz\">oz<\/option><\/select><\/div><small>Use the weight of one container or measured cup, not the full multipack.<\/small><\/div><\/section>\n      <section class=\"mf-food mf-dry\" aria-labelledby=\"mf-dry-title\"><div class=\"mf-lane-heading\"><span aria-hidden=\"true\">B<\/span><h3 id=\"mf-dry-title\">Dry food<\/h3><\/div><div class=\"mf-field\"><label for=\"mf-dry-name\">Food name <span>(optional)<\/span><\/label><input id=\"mf-dry-name\" name=\"dryName\" type=\"text\" maxlength=\"200\" placeholder=\"Brand and recipe\"><\/div><div class=\"mf-field\"><label for=\"mf-dry-kcal\">Label calories<\/label><input id=\"mf-dry-kcal\" name=\"dryKcal\" type=\"number\" inputmode=\"decimal\" min=\"0.01\" step=\"any\" placeholder=\"e.g. 4000\"><\/div><div class=\"mf-field\"><label for=\"mf-dry-basis\">These calories are per<\/label><select id=\"mf-dry-basis\" name=\"dryBasis\"><option value=\"kg\">kg<\/option><option value=\"100g\">100 g<\/option><option value=\"cup\">Cup (as defined on the label)<\/option><\/select><\/div><div class=\"mf-field\" data-role=\"cup-field\" hidden><label for=\"mf-cup-grams\">Grams per cup <span>(optional)<\/span><\/label><input id=\"mf-cup-grams\" name=\"dryCupGrams\" type=\"number\" inputmode=\"decimal\" min=\"0.01\" step=\"any\" placeholder=\"From this food\u2019s label\" disabled aria-describedby=\"mf-cup-help\"><small id=\"mf-cup-help\">Without this, you can get cups but not grams or bag costs. If the label lists kcal\/kg, use that instead.<\/small><\/div><div class=\"mf-label-tip\"><strong>Find \u201cCalorie Content\u201d<\/strong><p>Copy kcal\/kg, kcal\/100 g or kcal\/cup. Protein percentages and \u201ccups per day\u201d are different numbers.<\/p><a href=\"#mf-labels\">Show me a label example \u2193<\/a><\/div><\/section>\n     <\/div>\n    <\/fieldset>\n    <fieldset class=\"mf-step mf-cost-step\"><legend><span>04<\/span> Add prices &amp; budget days <em>Optional prices<\/em><\/legend><p class=\"mf-fieldset-note\">Leave prices blank for portions only. Enter both active foods\u2019 prices for the full budget. Use one currency throughout.<\/p><div class=\"mf-grid mf-two\"><div class=\"mf-field\"><label for=\"mf-currency\">Currency<\/label><select id=\"mf-currency\" name=\"currency\"><option value=\"USD\">USD \u2014 US dollar<\/option><option value=\"GBP\">GBP \u2014 British pound<\/option><option value=\"EUR\">EUR \u2014 Euro<\/option><option value=\"CAD\">CAD \u2014 Canadian dollar<\/option><option value=\"AUD\">AUD \u2014 Australian dollar<\/option><option value=\"CNY\">CNY \u2014 Chinese yuan<\/option><\/select><\/div><div class=\"mf-field\"><label for=\"mf-days\">Budget period<\/label><div class=\"mf-input-unit\"><input id=\"mf-days\" name=\"days\" type=\"number\" inputmode=\"numeric\" min=\"1\" max=\"366\" step=\"1\" value=\"30\"><span>days<\/span><\/div><\/div><\/div>\n     <div class=\"mf-food-lanes\"><section class=\"mf-price-lane\" aria-label=\"Wet food pricing\"><h3>A \/ Wet pack<\/h3><div class=\"mf-field\"><label for=\"mf-wet-price\">Price of the whole pack<\/label><input id=\"mf-wet-price\" name=\"wetPrice\" type=\"number\" inputmode=\"decimal\" min=\"0\" step=\"any\" placeholder=\"e.g. 18.00\"><\/div><div class=\"mf-field\"><label for=\"mf-wet-pack\">Units in that pack<\/label><input id=\"mf-wet-pack\" name=\"wetPack\" type=\"number\" inputmode=\"numeric\" min=\"1\" max=\"10000\" step=\"1\" value=\"1\"><small>Use 1 for a single can; 12 for a 12-pack.<\/small><\/div><\/section><section class=\"mf-price-lane\" aria-label=\"Dry food pricing\"><h3>B \/ Dry bag<\/h3><div class=\"mf-field\"><label for=\"mf-dry-price\">Price of one bag<\/label><input id=\"mf-dry-price\" name=\"dryPrice\" type=\"number\" inputmode=\"decimal\" min=\"0\" step=\"any\" placeholder=\"e.g. 20.00\"><\/div><div class=\"mf-field\"><label for=\"mf-bag-weight\">Net weight of that bag<\/label><div class=\"mf-unit-pair\"><input id=\"mf-bag-weight\" name=\"dryBagWeight\" type=\"number\" inputmode=\"decimal\" min=\"0.01\" step=\"any\" placeholder=\"e.g. 2\"><select name=\"dryBagUnit\" aria-label=\"Dry bag weight measurement\"><option value=\"kg\">kg<\/option><option value=\"g\">g<\/option><option value=\"lb\">lb<\/option><\/select><\/div><\/div><\/section><\/div>\n     <details class=\"mf-household\"><summary>Meal split &amp; more than one cat<\/summary><div class=\"mf-grid mf-two\"><div class=\"mf-field\"><label for=\"mf-meals\">Equal meals per cat, per day<\/label><input id=\"mf-meals\" name=\"meals\" type=\"number\" min=\"1\" max=\"8\" step=\"1\" value=\"2\"><small>Optional arithmetic split; foods can be served separately.<\/small><\/div><div class=\"mf-field\"><label for=\"mf-cats\">Cats using this exact daily plan<\/label><input id=\"mf-cats\" name=\"cats\" type=\"number\" min=\"1\" max=\"20\" step=\"1\" value=\"1\"><small>Multiplies shopping totals only. Calculate each cat separately if needs differ.<\/small><\/div><\/div><\/details>\n    <\/fieldset>\n    <div class=\"mf-submit-area\"><p class=\"mf-error\" data-role=\"error\" role=\"alert\" hidden><\/p><div class=\"mf-form-actions\"><button class=\"mf-primary\" type=\"submit\" data-ready disabled>Build my plan<\/button><button class=\"mf-reset\" type=\"button\" data-action=\"reset\">Reset<\/button><\/div><p>Portions stay in this tab. No account or saved feeding profile.<\/p><noscript><p>Enable JavaScript to calculate. The examples, label guide and formulas below remain available.<\/p><\/noscript><\/div>\n   <\/form>\n   <aside class=\"mf-receipt\" aria-labelledby=\"mf-receipt-title\"><div class=\"mf-receipt-top\"><span>YOUR FEEDING TICKET<\/span><span data-out=\"receipt-cat-name\">PER CAT \/ DAY<\/span><\/div><h2 id=\"mf-receipt-title\">From bowl<br>to basket.<\/h2><div data-role=\"empty\"><p>Build a plan to see measured portions, food cost and whole-pack purchases here.<\/p><ol><li>Set your daily calories.<\/li><li>Copy your food labels.<\/li><li>Add prices for the budget.<\/li><\/ol><div class=\"mf-empty-equation\"><span>Wet<\/span><span>+<\/span><span>Dry<\/span><span>=<\/span><span>One budget<\/span><\/div><\/div>\n    <div data-role=\"result\" hidden><p class=\"mf-example-stamp\" data-out=\"provenance\" hidden><\/p><p class=\"mf-receipt-caption\" data-out=\"calorie-line\"><\/p><div class=\"mf-calorie-bar\" aria-hidden=\"true\"><span data-out=\"wet-bar\"><\/span><span data-out=\"dry-bar\"><\/span><span data-out=\"treat-bar\"><\/span><\/div><div class=\"mf-bar-key\" data-out=\"bar-key\"><\/div><div class=\"mf-ticket-item\"><div><strong data-out=\"wet-title\">Wet food<\/strong><span data-out=\"wet-calories\"><\/span><\/div><b data-out=\"wet-amount\"><\/b><small data-out=\"wet-detail\"><\/small><\/div><div class=\"mf-ticket-item\"><div><strong>Dry food<\/strong><span data-out=\"dry-calories\"><\/span><\/div><b data-out=\"dry-amount\"><\/b><small data-out=\"dry-detail\"><\/small><\/div><p class=\"mf-meal-note\" data-out=\"meal-note\"><\/p>\n     <div class=\"mf-receipt-divider\"><\/div><p class=\"mf-receipt-eyebrow\" data-out=\"budget-label\"><\/p><div class=\"mf-spend\"><span>Food used<\/span><strong data-out=\"used-cost\"><\/strong><\/div><p class=\"mf-cost-detail\" data-out=\"daily-cost\"><\/p><div class=\"mf-checkout\"><div><span>Whole packs to buy<\/span><strong data-out=\"checkout-cost\"><\/strong><\/div><p data-out=\"checkout-note\"><\/p><\/div><div class=\"mf-shopping-list\" data-out=\"shopping-list\"><\/div><p class=\"mf-price-note\">Treat purchases, shipping, tax and food waste are excluded. Prices are yours; no currency conversion.<\/p><div class=\"mf-warnings\" data-out=\"warnings\"><\/div><div class=\"mf-ticket-actions\"><button type=\"button\" data-action=\"copy\">Copy plan<\/button><button type=\"button\" data-action=\"print\">Print plan<\/button><\/div>\n     <button type=\"button\" class=\"mf-handoff-action\" data-action=\"create-sitter-sheet\">Add this feeding plan to a sitter sheet \u2192<\/button>\n    <\/div><p class=\"mf-status\" data-role=\"status\" role=\"status\" aria-live=\"polite\"><\/p>\n   <\/aside>\n  <\/div>\n <\/section>\n <section id=\"mf-compare\" class=\"mf-section mf-comparison\" aria-labelledby=\"mf-compare-title\"><div class=\"mf-section-heading\"><div><p class=\"mf-eyebrow\">THE SAME CALORIE BUDGET<\/p><h2 id=\"mf-compare-title\">What changes when you change the mix?<\/h2><\/div><p>Compare portions and food consumed over your budget period. Ratios are calorie shares, not nutrition rankings.<\/p><\/div><div data-role=\"compare-empty\" class=\"mf-comparison-empty\">Your 25%, 50% and 75% wet-food comparisons appear after you build a plan.<\/div><div data-role=\"compare-result\" hidden><div class=\"mf-table-scroll\" tabindex=\"0\" role=\"region\" aria-label=\"Mixed-feeding calorie ratio comparison\"><table><caption data-out=\"compare-caption\"><\/caption><thead><tr><th scope=\"col\">Wet calorie share<\/th><th scope=\"col\">Wet units \/ cat \/ day<\/th><th scope=\"col\">Dry \/ cat \/ day<\/th><th scope=\"col\">Food used cost<\/th><th scope=\"col\">Try it<\/th><\/tr><\/thead><tbody data-out=\"compare-rows\"><\/tbody><\/table><\/div><p class=\"mf-comparison-note\">These alternatives use the same food labels, treat allowance and calorie target. Incomplete labels or prices are shown as unavailable, never estimated from another brand.<\/p><\/div><\/section>\n <section class=\"mf-section\" aria-labelledby=\"mf-one-can-title\"><div class=\"mf-example-story\"><div><p class=\"mf-eyebrow\">\u201cI FEED ONE CAN. HOW MUCH DRY FOOD?\u201d<\/p><h2 id=\"mf-one-can-title\">Subtract the wet calories first.<\/h2><p style=\"margin-top:15px\">Suppose a cat\u2019s existing target is <b>240 kcal\/day<\/b>, including <b>20 kcal of treats<\/b>. That leaves 220 kcal for complete food. If one can supplies 100 kcal, the dry food must supply the remaining 120 kcal.<\/p><\/div><div><h3>One can + 30 g dry<\/h3><p>At 4,000 kcal\/kg, dry food supplies 4 kcal per gram. Divide 120 by 4 to get <b>30 g of dry food<\/b>, alongside the one can. Use \u201cStart with daily cans \/ pouches\u201d above to do this with your labels.<\/p><p style=\"margin-top:12px\">This is a worked arithmetic example, not a calorie recommendation. A different can or kibble changes the answer.<\/p><\/div><\/div><\/section>\n<section id=\"mf-labels\" class=\"mf-section\" aria-labelledby=\"mf-label-title\"><div class=\"mf-section-heading\"><div><p class=\"mf-eyebrow\">BEFORE YOU MEASURE A MEAL<\/p><h2 id=\"mf-label-title\">Where are the calories on cat food labels?<\/h2><\/div><p>Look for \u201cCalorie Content,\u201d \u201cMetabolizable Energy\u201d or \u201cME.\u201d Copy the number and its unit together.<\/p><\/div><div class=\"mf-explainer\"><div class=\"mf-prose\"><h3>Wet food: check one container<\/h3><p>\u201c100 kcal per can\u201d is the energy in one can. \u201c100 kcal per 100 g\u201d is an energy density. They only mean the same thing if that can contains exactly 100 g. Enter the net weight of a single can, pouch or tray so the calculator can also show grams.<\/p><div class=\"mf-label-sample\"><h3>Illustrative wet label<\/h3><div class=\"mf-label-line\"><span>Net weight<\/span><strong>85 g per can<\/strong><\/div><div class=\"mf-label-line\"><span>Calorie content<\/span><strong>100 kcal\/can<\/strong><\/div><p>Enter 100, choose \u201cOne can \/ pouch \/ tray,\u201d and enter 85 g. This is a fictional label example.<\/p><\/div><\/div><div class=\"mf-prose\"><h3>Dry food: kg is not a serving<\/h3><p>\u201c4,000 kcal\/kg\u201d means 4 kcal per gram. It does not mean a cat needs a kilogram. A food labeled 400 kcal\/100 g has the same energy density. Use whichever unit your own packaging provides.<\/p><div class=\"mf-label-sample\"><h3>Illustrative dry label<\/h3><div class=\"mf-label-line\"><span>Calorie content<\/span><strong>4,000 kcal\/kg<\/strong><\/div><div class=\"mf-label-line\"><span>Same density<\/span><strong>400 kcal\/100 g<\/strong><\/div><p>If you only have kcal\/cup, select cups. Grams per cup vary between foods; do not assume a universal cup weight.<\/p><\/div><\/div><\/div><p class=\"mf-method-notes\">Want to understand the rest of the label? Read <a href=\"https:\/\/snugglesouls.com\/how-to-read-cat-food-labels\/\">how to read cat food labels<\/a>, including calorie content and nutritional adequacy. For weighing small portions, see <a href=\"https:\/\/snugglesouls.com\/how-to-use-kitchen-scale-cat-food-portions\/\">using a kitchen scale for cat food<\/a>.<\/p><\/section>\n<p class=\"mf-method-notes\"><a href=\"#mf-wet-kcal\">Return to wet-food fields \u2191<\/a> &nbsp; \/ &nbsp; <a href=\"#mf-dry-kcal\">Return to dry-food fields \u2191<\/a><\/p>\n<section class=\"mf-section\" aria-labelledby=\"mf-monthly-title\"><div class=\"mf-section-heading\"><div><p class=\"mf-eyebrow\">FOOD COST \u2260 TODAY\u2019S RECEIPT<\/p><h2 id=\"mf-monthly-title\">How much will mixed feeding cost per month?<\/h2><\/div><p>The calculator shows both the value of food used and what you would pay to buy enough whole packs.<\/p><\/div><div class=\"mf-explainer mf-prose\"><div><h3>Food consumed during the period<\/h3><p>Using the fictional labels above, a 50% wet \/ 50% dry calorie split uses 1.1 cans and 27.5 g of dry food each day. If a 12-pack costs $18 and a 2 kg dry bag costs $20, the food used costs about <strong>$1.93\/day<\/strong>, or <strong>$57.75 over 30 days<\/strong> for one cat.<\/p><p>Amounts are calculated at full precision before money is rounded. Multiplying the displayed rounded daily price can therefore differ by a few cents.<\/p><\/div><div><h3>Whole packs you need to buy<\/h3><p>The same 30-day plan uses 33 cans and 825 g of kibble. Starting with no food in stock, you would buy three 12-packs and one 2 kg bag: <strong>$74 at checkout<\/strong>. Three cans and 1,175 g of dry food remain for later.<\/p><p>The model assumes usable leftovers carry forward. Food discarded, delivery charges, tax and treat purchases are not included. Choose your actual period; \u201c30 days\u201d is a budget window, not every calendar month.<\/p><\/div><\/div><\/section>\n<section id=\"mf-method\" class=\"mf-section\" aria-labelledby=\"mf-method-title\"><div class=\"mf-section-heading\"><div><p class=\"mf-eyebrow\">OPEN CALCULATION METHOD<\/p><h2 id=\"mf-method-title\">How does the mixed feeding calculator work?<\/h2><\/div><p>All portions come from your calorie target and food labels. No average brand values, breed multipliers or price database are substituted.<\/p><\/div><div class=\"mf-explainer mf-prose\"><div><h3>Convert calories into food<\/h3><p class=\"mf-formula\">Food budget = total target \u2212 treat calories<br>Wet kcal = food budget \u00d7 wet percentage \u00f7 100<br>Wet units = wet kcal \u00f7 kcal per unit<br>Dry kcal = food budget \u2212 wet kcal<br>Dry grams = dry kcal \u00f7 kcal per gram<\/p><p>For fixed wet units, wet calories equal units \u00d7 kcal per unit. Dry food fills the remainder. If the chosen wet amount already exceeds the food budget, the calculator asks you to reduce it instead of producing a negative dry portion.<\/p><p>When using cups, dry cups = dry kcal \u00f7 kcal per cup. Grams and bag costs need that food\u2019s grams per cup. The calculator will still give cup portions when that conversion is unknown.<\/p><\/div><div><h3>Convert portions into purchases<\/h3><p class=\"mf-formula\">Wet cost\/day = daily units \u00d7 pack price \u00f7 units per pack<br>Dry cost\/day = daily grams \u00d7 bag price \u00f7 bag grams<br>Food used cost = combined daily cost \u00d7 days \u00d7 cats<br>Packs to buy = round required food \u00f7 pack size UP to the next whole pack<\/p><p>The \u201ccats\u201d setting assumes each cat follows the exact same individual plan. It scales household shopping totals and package duration; displayed daily portions remain per cat. Use a separate worksheet when cats\u2019 needs or foods differ.<\/p><p>Weight conversion: 1 oz = 28.349523125 g; 1 lb = 453.59237 g. Costs use full precision; displayed grams, units and money are rounded. Bag duration describes quantity used, not freshness or safe storage time.<\/p><\/div><\/div><div class=\"mf-method-notes\"><h3>What this worksheet can\u2014and cannot\u2014tell you<\/h3><p>Use foods appropriate for your cat\u2019s life stage and nutritional needs. In the US, the nutritional adequacy statement explains whether a food is \u201ccomplete and balanced\u201d; treats, toppers and complementary products may not provide a complete diet. <a href=\"#mf-ref-fda\">[1]<\/a> Matching calories alone does not verify nutrient balance or make a prescription diet interchangeable.<\/p><p>WSAVA advises treats supply no more than 10% of a cat\u2019s daily calories. The tool flags a higher allowance, but 10% is a ceiling, not a treat target or a guarantee of nutritional suitability. <a href=\"#mf-ref-wsava\">[2]<\/a> Use a veterinary plan for growth, pregnancy, weight loss or health conditions, and discuss changes to therapeutic diets with the treating team.<\/p><p>Inputs remain in the current page tab; the tool does not store a feeding profile. Site-wide analytics follow our <a href=\"https:\/\/snugglesouls.com\/privacy-policy\/\">privacy policy<\/a>.<\/p><\/div><\/section>\n<section class=\"mf-section\" aria-labelledby=\"mf-guides-title\"><div class=\"mf-section-heading\"><div><p class=\"mf-eyebrow\">MAKE THE NUMBERS USEFUL<\/p><h2 id=\"mf-guides-title\">Build a mixed feeding routine that fits.<\/h2><\/div><p>Use the guides alongside your calculations to understand feeding choices and check how the plan is working.<\/p><\/div><div class=\"mf-link-list\"><a href=\"https:\/\/snugglesouls.com\/how-to-mix-wet-and-dry-cat-food\/\"><strong>How to mix wet and dry cat food<\/strong><span>Turn portions into a practical routine without adding full portions of both foods.<\/span><\/a><a href=\"https:\/\/snugglesouls.com\/wet-vs-dry-cat-food-guide\/\"><strong>Wet vs dry cat food<\/strong><span>Understand format differences before choosing a mix.<\/span><\/a><a href=\"https:\/\/snugglesouls.com\/cat-calorie-calculator\/\"><strong>Estimate a daily calorie target<\/strong><span>Start here if you do not already have a daily energy target.<\/span><\/a><a href=\"https:\/\/snugglesouls.com\/cat-bmi-weight-calculator\/\"><strong>Check body condition and weight trends<\/strong><span>Record changes rather than assuming the first portion is right forever.<\/span><\/a><a href=\"https:\/\/snugglesouls.com\/how-to-adjust-mixed-feeding-indoor-cats-weight-gain\/\"><strong>Mixed feeding when an indoor cat gains weight<\/strong><span>Review measurements, extras and the calorie budget.<\/span><\/a><\/div><\/section>\n<section id=\"mf-faq\" class=\"mf-section mf-faq\" aria-labelledby=\"mf-faq-title\"><p class=\"mf-eyebrow\">COMMON MIXED-FEEDING QUESTIONS<\/p><h2 id=\"mf-faq-title\">Wet, dry and the questions between.<\/h2>\n <details><summary>How much wet and dry food should I feed my cat?<\/summary><div>Start with an appropriate daily calorie target, subtract treats, then divide the remaining calories between the foods. Divide each food\u2019s calorie allowance by its label\u2019s kcal per unit or per gram. There is no universal number of cans or grams that fits all cats and products. This calculator performs the conversion; it does not prescribe your cat\u2019s calorie target.<\/div><\/details>\n <details><summary>If I feed one can of wet food, how much dry food should I add?<\/summary><div>Select \u201cStart with daily cans \/ pouches\u201d and enter 1. The calculator subtracts that can\u2019s calories from the food budget and converts what remains into dry food. In the worked example above, 240 total kcal minus 20 treat kcal minus a 100-kcal can leaves 120 kcal: 30 g of a 4,000-kcal\/kg dry food.<\/div><\/details>\n <details><summary>Is a 50\/50 wet and dry mix equal weights?<\/summary><div>No. Here, 50\/50 means each food supplies half of the food calories after treats. Wet and dry foods can have very different energy densities, so equal calories usually require different gram amounts. The percentage is a planning choice, not a claim that 50\/50 is best for your cat.<\/div><\/details>\n <details><summary>Can I mix different brands of wet and dry cat food?<\/summary><div>The calculator accepts any labels and does not require matching brands. It cannot determine whether two products are nutritionally suitable together. Check life-stage suitability and nutritional adequacy, introduce changes with your veterinary team\u2019s guidance, and seek advice before mixing a therapeutic diet with another food. See our <a href=\"https:\/\/snugglesouls.com\/how-to-mix-wet-and-dry-cat-food\/\">mixed feeding guide<\/a> for more context.<\/div><\/details>\n <details><summary>Why can I see cups but not grams or dry-food cost?<\/summary><div>Kcal\/cup tells us how much energy is in a label-defined cup, but not how many grams that cup weighs. Enter the grams per cup for this specific food or choose its kcal\/kg figure instead. A generic grams-per-cup assumption would distort grams, bag duration and cost.<\/div><\/details>\n <details><summary>Why is the shopping total higher than the food cost?<\/summary><div>Food cost counts only the portions consumed during your budget period. The shopping total starts with no stock and rounds up to whole packs and bags. Food remaining at the end still has value. The result assumes it is stored and used according to the manufacturer\u2019s instructions.<\/div><\/details>\n <details><summary>Can I use this for two or more cats?<\/summary><div>Yes, if each cat uses the same calorie target, labels and daily portions: expand \u201cMeal split &amp; more than one cat\u201d and change the cat count. Shopping totals scale up, but the daily portions stay per cat. Cats with different requirements need separate plans.<\/div><\/details>\n <details><summary>Do wet and dry food have to be mixed in the same bowl?<\/summary><div>No. Mixed feeding can mean wet meals and a separately measured dry portion. The worksheet totals calories over a day; its optional equal-meal division does not require feeding both formats together. Follow product instructions for serving and storing food, including opened containers and leftovers. <a href=\"#mf-ref-purina\">[3]<\/a><\/div><\/details>\n<\/section>\n<section class=\"mf-section mf-method-notes\" aria-labelledby=\"mf-sources-title\"><h2 id=\"mf-sources-title\">Sources &amp; food-label guidance<\/h2><ol><li id=\"mf-ref-fda\"><a href=\"https:\/\/www.fda.gov\/animal-veterinary\/animal-health-literacy\/complete-and-balanced-pet-food\" target=\"_blank\" rel=\"noopener\">FDA: \u201cComplete and Balanced\u201d Pet Food<\/a> \u2014 nutritional adequacy statements and foods intended as a sole diet.<\/li><li id=\"mf-ref-wsava\"><a href=\"https:\/\/wsava.org\/wp-content\/uploads\/2024\/06\/Feeding-treats-to-your-cat-v2.pdf\" target=\"_blank\" rel=\"noopener\">WSAVA Nutrition Committee: Feeding treats to your cat<\/a> \u2014 treat calorie limits and individual nutritional needs.<\/li><li id=\"mf-ref-purina\"><a href=\"https:\/\/www.purina.com\/articles\/cat\/feeding\/guides\/how-much-wet-food-should-i-feed-my-cat\" target=\"_blank\" rel=\"noopener\">Purina: How Much Wet Food Should You Feed a Cat?<\/a> \u2014 adjusting dry food when adding wet food and following storage guidance.<\/li><\/ol><p>The published calculation formulas are ordinary energy, mass and price arithmetic. These references support the nutrition context; they do not validate a specific calorie target or recommend a mixing ratio.<\/p><\/section>\n\n<\/div>\n\n<script data-no-optimize=\"1\" data-cfasync=\"false\">\n(function(){\"use strict\";\n\/\/ The energy target is supplied by the user. This engine does not prescribe it.\nfunction mfError(field, message){const e=new Error(message);e.field=field;throw e;}\nfunction mfNumber(value,field,label,min,max,integer=false){\n if(value===null||value===undefined||String(value).trim()==='')mfError(field,'Enter '+label+'.');\n const n=Number(value);\n if(!Number.isFinite(n)||n<min||n>max||(integer&&!Number.isInteger(n)))mfError(field,'Enter '+label+' between '+min+' and '+max+(integer?' as a whole number.':'.'));\n return n;\n}\nfunction mfOptional(value,field,label,min,max){return value===null||value===undefined||String(value).trim()===''?null:mfNumber(value,field,label,min,max);}\nfunction mfMass(value,unit){return value*({g:1,oz:28.349523125,kg:1000,lb:453.59237}[unit]||1);}\nfunction mfPacks(amount,pack){return amount<=0?0:Math.max(1,Math.ceil(amount\/pack-1e-9));}\nfunction mfCalculate(input){\n const target=mfNumber(input.target,'mf-target','a daily calorie target',1,10000);\n const treats=mfNumber(input.treats,'mf-treats','daily treat calories (use 0 for none)',0,10000);\n if(treats>=target)mfError('mf-treats','Treat calories must be below the total daily target so food calories remain.');\n const budget=target-treats,mode=input.mode==='fixed'?'fixed':'ratio';\n const share=mode==='ratio'?mfNumber(input.share,'mf-share','the wet-food calorie percentage',0,100):null;\n const fixed=mode==='fixed'?mfNumber(input.fixed,'mf-fixed','wet-food units per day',0,100):null;\n const needWet=mode==='fixed'?fixed>0:share>0;\n const days=mfNumber(input.days,'mf-days','budget days',1,366,true);\n const cats=mfNumber(input.cats,'mf-cats','cats using this same individual plan',1,20,true);\n const meals=mfNumber(input.meals,'mf-meals','equal meals per day',1,8,true);\n const warnings=[];\n if(treats\/target>0.1+1e-12)warnings.push('Treats exceed 10% of total daily calories. WSAVA advises no more than 10%; review the treat allowance with your veterinary team.');\n let wetKcalUnit=null,wetWeight=null;\n if(needWet){\n  const k=mfNumber(input.wetKcal,'mf-wet-kcal','wet-food label calories',0.01,100000);\n  wetWeight=mfMass(mfNumber(input.wetWeight,'mf-wet-weight','net weight of one wet-food unit',0.01,10000),input.wetWeightUnit);\n  wetKcalUnit=input.wetBasis==='100g'?k*wetWeight\/100:input.wetBasis==='kg'?k*wetWeight\/1000:k;\n }\n let wetCalories=needWet?(mode==='fixed'?fixed*wetKcalUnit:budget*share\/100):0;\n if(wetCalories>budget+1e-8)mfError('mf-fixed','This wet-food amount uses '+wetCalories.toFixed(1)+' kcal, above the '+budget.toFixed(1)+' kcal food budget. Reduce it to at most '+(budget\/wetKcalUnit).toFixed(3)+' units\/day (round down), or review the daily target.');\n wetCalories=Math.min(wetCalories,budget);\n const dryCalories=Math.max(0,budget-wetCalories),needDry=dryCalories>1e-8;\n let dryDensity=null,dryNative='g',dryGramsPerCup=null,dryAmount=0,dryGrams=0,dryCups=null;\n if(needDry){\n  const k=mfNumber(input.dryKcal,'mf-dry-kcal','dry-food label calories',0.01,100000);\n  if(input.dryBasis==='cup'){\n   dryNative='cup';dryDensity=k;dryGramsPerCup=mfOptional(input.dryCupGrams,'mf-cup-grams','grams per cup from this food label',0.01,1000);\n   dryAmount=dryCalories\/k;dryCups=dryAmount;dryGrams=dryGramsPerCup===null?null:dryAmount*dryGramsPerCup;\n   if(dryGrams===null)warnings.push('Dry food is shown in label-defined cups. Add this food\u2019s grams per cup, or use kcal\/kg or kcal\/100 g, to calculate grams, bag duration and dry-food cost.');\n  }else{\n   dryDensity=input.dryBasis==='100g'?k\/100:k\/1000;dryAmount=dryCalories\/dryDensity;dryGrams=dryAmount;\n  }\n }\n const wetUnits=wetCalories===0?0:wetCalories\/wetKcalUnit,wetGrams=wetCalories===0?0:wetUnits*wetWeight;\n let wetPrice=null,wetPack=null,wetCost=needWet?null:0,dryPrice=null,dryBagGrams=null,dryCost=needDry?null:0;\n if(needWet){\n  wetPrice=mfOptional(input.wetPrice,'mf-wet-price','the wet pack price',0,1000000);\n  if(wetPrice!==null){wetPack=mfNumber(input.wetPack,'mf-wet-pack','units in the wet pack',1,10000,true);wetCost=wetUnits*wetPrice\/wetPack;}\n }\n if(needDry){\n  dryPrice=mfOptional(input.dryPrice,'mf-dry-price','the dry bag price',0,1000000);\n  if(dryPrice!==null){\n   dryBagGrams=mfMass(mfNumber(input.dryBagWeight,'mf-bag-weight','the dry bag net weight',0.01,100000),input.dryBagUnit);\n   if(dryGrams!==null)dryCost=dryGrams*dryPrice\/dryBagGrams;\n  }\n }\n const dailyCost=wetCost===null||dryCost===null?null:wetCost+dryCost;\n const wetNeeded=wetUnits*days*cats,dryNeeded=dryGrams===null?null:dryGrams*days*cats;\n const wetPacks=!needWet?0:wetPack===null?null:mfPacks(wetNeeded,wetPack);\n const dryPacks=!needDry?0:dryNeeded===null||dryBagGrams===null?null:mfPacks(dryNeeded,dryBagGrams);\n const wetCheckout=wetPacks===null?null:wetPacks*(wetPrice||0),dryCheckout=dryPacks===null?null:dryPacks*(dryPrice||0);\n return {target,treats,budget,mode,share:wetCalories\/budget*100,days,cats,meals,warnings,\n  wet:{calories:wetCalories,units:wetUnits,grams:wetGrams,kcalUnit:wetKcalUnit,unitName:['can','pouch','tray','cup'].includes(input.wetUnitName)?input.wetUnitName:'can',dailyCost:wetCost,price:wetPrice,pack:wetPack,needed:wetNeeded,packs:wetPacks,checkout:wetCheckout,leftover:wetPacks===null?null:Math.max(0,wetPacks*(wetPack||0)-wetNeeded),packDays:wetPack===null||!needWet?null:wetPack\/(wetUnits*cats),cost100:wetPrice===null?null:100*wetPrice\/wetPack\/wetKcalUnit},\n  dry:{calories:dryCalories,amount:dryAmount,native:dryNative,grams:dryGrams,cups:dryCups,dailyCost:dryCost,price:dryPrice,bagGrams:dryBagGrams,needed:dryNeeded,packs:dryPacks,checkout:dryCheckout,leftover:dryPacks===null||dryNeeded===null?null:Math.max(0,dryPacks*(dryBagGrams||0)-dryNeeded),bagDays:dryBagGrams===null||!needDry||dryGrams===null?null:dryBagGrams\/(dryGrams*cats),cost100:dryCost===null||dryCalories===0?null:100*dryCost\/dryCalories},\n  dailyCost,totalUsedCost:dailyCost===null?null:dailyCost*days*cats,totalCheckout:wetCheckout===null||dryCheckout===null?null:wetCheckout+dryCheckout,\n  currency:['USD','GBP','EUR','CAD','AUD','CNY'].includes(input.currency)?input.currency:'USD'};\n}\n\nconst mfRoot=document.getElementById('ss-mixed-tool');\nif(!mfRoot||mfRoot.dataset.initialized)return;\nconst mfForm=mfRoot.querySelector('#mf-form');let mfLast=null,mfDemo=false,mfTouched=false,mfPendingHandoff=null;\nconst mfFind=s=>mfRoot.querySelector(s),mfOut=(key,value)=>{mfFind('[data-out=\"'+key+'\"]').textContent=value;};\nconst mfFmt=(n,d=2)=>new Intl.NumberFormat('en-US',{maximumFractionDigits:d}).format(n);\nfunction mfMoney(n,currency){if(n===null)return 'Not calculated';const f=new Intl.NumberFormat('en-US',{style:'currency',currency,maximumFractionDigits:2});return n>0&&n<0.005?'< '+f.format(.01):f.format(n);}\nfunction mfRead(){return Object.fromEntries(new FormData(mfForm).entries());}\nconst mfHandoffKey='snugglesouls.calorie-to-mixed.v1';\nfunction mfConsumeHandoff(){\n try{\n  const raw=sessionStorage.getItem(mfHandoffKey);if(!raw)return null;sessionStorage.removeItem(mfHandoffKey);\n  const packet=JSON.parse(raw),v=packet.values,now=Date.now();\n  if(packet.version!==1||packet.flow!=='calorie-to-mixed'||!Number.isFinite(packet.createdAt)||now-packet.createdAt>20*60*1000||packet.createdAt>now+60000||!v||typeof v!=='object')return null;\n  const number=(key,min,max,integer=false)=>{if(v[key]===undefined)return;const n=Number(v[key]);if(!Number.isFinite(n)||n<min||n>max||(integer&&!Number.isInteger(n)))throw new Error('Invalid transferred value');v[key]=n;};\n  number('target',1,10000);number('treats',0,10000);number('share',0,100);number('meals',1,8,true);\n  if(v.target===undefined||v.treats===undefined||v.share===undefined||v.meals===undefined||v.treats>=v.target)return null;\n  for(const key of ['wetKcal','dryKcal'])number(key,0.01,100000);\n  for(const key of ['wetWeight','dryCupGrams','wetPrice','dryPrice'])number(key,0,1000000);\n  number('wetPack',1,10000,true);number('dryBagWeight',0.01,100000);\n  const text=(key,max=200)=>{if(v[key]!==undefined&&(typeof v[key]!=='string'||v[key].length>max))throw new Error('Invalid transferred text');};\n  for(const key of ['catName','wetName','dryName'])text(key);\n  if(v.calorieSource&&!['example','vet-target','estimate'].includes(v.calorieSource))return null;\n  if(v.currency&&!['USD','GBP','EUR','CAD','AUD','CNY'].includes(v.currency))return null;\n  if(v.wetBasis&&!['unit','100g','kg'].includes(v.wetBasis))return null;\n  if(v.dryBasis&&!['kg','100g','cup'].includes(v.dryBasis))return null;\n  if(v.wetUnitName&&!['can','pouch','tray','cup'].includes(v.wetUnitName))return null;\n  if(v.wetWeightUnit&&!['g','oz'].includes(v.wetWeightUnit))return null;\n  if(v.dryBagUnit&&!['kg','g','lb'].includes(v.dryBagUnit))return null;\n  return {example:packet.example===true,values:v};\n }catch(e){return null;}\n}\nfunction mfShowHandoff(packet){\n mfPendingHandoff=packet;if(!packet)return;\n const v=packet.values,cat=v.catName?' for '+v.catName:'',basis=packet.example||v.calorieSource==='example'?'demo values from the sample plan':v.calorieSource==='vet-target'?'the daily target you entered':'an estimate from the calorie calculator';\n const labels=[v.wetKcal!==undefined?'wet-food label':'',v.dryKcal!==undefined?'dry-food label':''].filter(Boolean).join(' and ');\n const wetNeedsSize=v.wetKcal!==undefined&&(v.wetWeight===undefined||v.wetUnitName===undefined);\n mfFind('[data-role=\"handoff-summary\"]').textContent='A daily total of '+mfFmt(v.target,1)+' kcal'+cat+' from '+basis+', with '+mfFmt(v.treats,1)+' kcal for treats separated, '+mfFmt(v.share,1)+'% wet-food calories, '+mfFmt(v.meals)+' meals, and '+(labels||'no compatible food labels')+'. '+(wetNeedsSize?'Confirm the wet container type and net weight before calculating. ':'')+'Review before applying.';\n mfFind('[data-role=\"handoff-note\"]').hidden=false;\n}\nfunction mfApplyHandoff(packet){\n if(mfTouched&&!window.confirm('Replace the values currently entered in this feeding planner with the reviewed calorie-plan values?'))return false;\n mfForm.reset();const v=packet.values;\n for(const [key,value] of Object.entries(v)){const field=mfForm.elements.namedItem(key);if(field&&value!==undefined)field.value=String(value);}\n mfForm.elements.mode.value='ratio';mfDemo=packet.example;mfTouched=false;\n const source=mfFind('[data-role=\"target-source\"]');source.hidden=false;source.textContent=packet.example||v.calorieSource==='example'?'Sample values from the calorie calculator. Replace them before use.':v.calorieSource==='vet-target'?'Source: daily target entered in the cat calorie calculator.':'Source: educational estimate from the cat calorie calculator.';\n mfFind('[data-role=\"demo-note\"]').hidden=!mfDemo;mfFind('[data-role=\"handoff-note\"]').hidden=true;\n mfPendingHandoff=null;mfSync();mfClear();\n mfFind('[data-role=\"status\"]').textContent='Values added. Review the wet unit size and every food label; treats were carried separately and are subtracted once when you build the plan.';\n mfFind('#mf-target').focus({preventScroll:true});return true;\n}\nfunction mfUnitName(r,amount){if(Math.abs(amount-1)<1e-9)return r.wet.unitName;return ({can:'cans',pouch:'pouches',tray:'trays',cup:'cups'})[r.wet.unitName]||r.wet.unitName+'s';}\nfunction mfWetText(r,divisor=1){const n=r.wet.units\/divisor;return mfFmt(n)+' '+mfUnitName(r,n);}\nfunction mfDryText(r,divisor=1){if(r.dry.calories===0)return '0 g';return r.dry.grams===null?mfFmt(r.dry.cups\/divisor,3)+' cups':mfFmt(r.dry.grams\/divisor,1)+' g';}\nfunction mfSync(){\n const fixed=mfForm.elements.mode.value==='fixed';\n mfRoot.querySelectorAll('[data-mode]').forEach(el=>{const active=el.dataset.mode===(fixed?'fixed':'ratio');el.hidden=!active;el.querySelectorAll('input').forEach(input=>input.disabled=!active);});\n const cup=mfForm.elements.dryBasis.value==='cup';mfFind('[data-role=\"cup-field\"]').hidden=!cup;mfForm.elements.dryCupGrams.disabled=!cup;\n const share=Number(mfForm.elements.share.value);if(Number.isFinite(share)&&share>=0&&share<=100){mfFind('#mf-slider').value=share;mfFind('[data-role=\"ratio-label\"]').textContent=mfFmt(share)+'% wet \/ '+mfFmt(100-share)+'% dry';}\n}\nfunction mfClear(){\n mfLast=null;mfFind('[data-role=\"result\"]').hidden=true;mfFind('[data-role=\"empty\"]').hidden=false;\n mfFind('[data-role=\"compare-result\"]').hidden=true;mfFind('[data-role=\"compare-empty\"]').hidden=false;\n mfFind('[data-role=\"error\"]').hidden=true;mfRoot.querySelectorAll('[aria-invalid=true]').forEach(el=>{el.removeAttribute('aria-invalid');el.removeAttribute('aria-errormessage');});\n mfFind('[data-role=\"status\"]').textContent='';\n}\nfunction mfParagraph(parent,text){const p=document.createElement('p');p.textContent=text;parent.append(p);}\nfunction mfShopping(r){\n const host=mfFind('[data-out=\"shopping-list\"]');host.replaceChildren();\n if(r.wet.calories>0){\n  const used=mfFmt(r.wet.needed)+' '+mfUnitName(r,r.wet.needed)+' used';\n  if(r.wet.packs===null)mfParagraph(host,'Wet: '+used+'. Add pack price and count for whole-pack purchases.');\n  else mfParagraph(host,'Wet: buy '+r.wet.packs+' pack'+(r.wet.packs===1?'':'s')+' \u00d7 '+r.wet.pack+' '+mfUnitName(r,r.wet.pack)+'. '+used+'; about '+mfFmt(r.wet.leftover)+' units remain. One pack covers about '+mfFmt(r.wet.packDays,1)+' days for this household.');\n }\n if(r.dry.calories>0){\n  if(r.dry.needed===null)mfParagraph(host,'Dry: add the label\u2019s grams per cup, or use kcal\/kg, to calculate bag purchases.');\n  else if(r.dry.packs===null)mfParagraph(host,'Dry: '+mfFmt(r.dry.needed,1)+' g used. Add bag price and net weight for whole-bag purchases.');\n  else mfParagraph(host,'Dry: buy '+r.dry.packs+' bag'+(r.dry.packs===1?'':'s')+' \u00d7 '+mfFmt(r.dry.bagGrams,0)+' g. About '+mfFmt(r.dry.needed,1)+' g used; '+mfFmt(r.dry.leftover,1)+' g remain. One bag covers about '+mfFmt(r.dry.bagDays,1)+' days for this household.');\n }\n}\nfunction mfCompare(input,current){\n const body=mfFind('[data-out=\"compare-rows\"]');body.replaceChildren();\n const shares=[...new Set([25,50,75,Math.round(current.share*100)\/100])].sort((a,b)=>a-b);\n for(const share of shares){\n  const tr=document.createElement('tr');const active=Math.abs(current.share-share)<.001;tr.dataset.current=String(active);\n  let r=null;try{r=mfCalculate({...input,mode:'ratio',share});}catch(e){}\n  const values=[mfFmt(share)+'%'+(active?' \u00b7 current':''),r?mfWetText(r):'Label needed',r?mfDryText(r):'Label needed',r?mfMoney(r.totalUsedCost,r.currency):'Unavailable'];\n  values.forEach(text=>{const td=document.createElement('td');td.textContent=text;tr.append(td);});\n  const td=document.createElement('td');const b=document.createElement('button');b.type='button';b.textContent=active?'Current':'Use mix';b.disabled=!r||active;b.dataset.useShare=share;b.setAttribute('aria-label','Use '+mfFmt(share)+' percent wet-food calories');td.append(b);tr.append(td);body.append(tr);\n }\n mfOut('compare-caption',current.days+' days \u00b7 '+current.cats+' cat'+(current.cats===1?'':'s')+' \u00b7 '+current.currency+' \u00b7 '+mfFmt(current.budget)+' food kcal per cat\/day');\n mfFind('[data-role=\"compare-empty\"]').hidden=true;mfFind('[data-role=\"compare-result\"]').hidden=false;\n}\nfunction mfRender(r,input){\n mfLast={result:r,input};mfFind('[data-role=\"empty\"]').hidden=true;mfFind('[data-role=\"result\"]').hidden=false;\n const proof=mfFind('[data-out=\"provenance\"]');proof.hidden=!mfDemo;proof.textContent='EXAMPLE-BASED PLAN \u00b7 Verify every label and price before use.';\n mfOut('calorie-line',mfFmt(r.target)+' kcal total = '+mfFmt(r.budget)+' food + '+mfFmt(r.treats)+' treats');\n for(const [key,value] of [['wet-bar',r.wet.calories],['dry-bar',r.dry.calories],['treat-bar',r.treats]])mfFind('[data-out=\"'+key+'\"]').style.width=(value\/r.target*100)+'%';\n mfOut('bar-key','Wet '+mfFmt(r.wet.calories,1)+' kcal \u00b7 Dry '+mfFmt(r.dry.calories,1)+' kcal \u00b7 Treats '+mfFmt(r.treats,1)+' kcal');\n mfOut('wet-title','Wet food \u00b7 '+mfFmt(r.share,1)+'% of food kcal');mfOut('wet-calories',mfFmt(r.wet.calories,1)+' kcal');mfOut('wet-amount',mfWetText(r));\n mfOut('wet-detail',r.wet.calories===0?'Not used in this plan.':mfFmt(r.wet.grams,1)+' g\/day \u00b7 '+(r.wet.dailyCost===null?'price not entered':mfMoney(r.wet.dailyCost,r.currency)+'\/cat\/day'));\n mfOut('dry-calories',mfFmt(r.dry.calories,1)+' kcal');mfOut('dry-amount',mfDryText(r));\n mfOut('dry-detail',r.dry.calories===0?'Not used in this plan.':(r.dry.cups!==null&&r.dry.grams!==null?mfFmt(r.dry.cups,3)+' label cups\/day \u00b7 ':'')+(r.dry.dailyCost===null?'cost needs price \/ weight data':mfMoney(r.dry.dailyCost,r.currency)+'\/cat\/day'));\n mfOut('meal-note','If evenly divided into '+r.meals+' meal'+(r.meals===1?'':'s')+': '+mfWetText(r,r.meals)+' wet + '+mfDryText(r,r.meals)+' dry per cat, per meal. You can also serve the foods separately.');\n mfOut('budget-label',r.currency+' \/ '+r.days+' DAYS \/ '+r.cats+' CAT'+(r.cats===1?'':'S'));\n const catName=String(input.catName||'').trim();mfOut('receipt-cat-name',(catName?catName+' \u00b7 ':'')+'PER CAT \/ DAY');\n mfOut('used-cost',mfMoney(r.totalUsedCost,r.currency));\n mfOut('daily-cost',r.dailyCost===null?'Add every active food\u2019s price and conversion data to see a full total.':mfMoney(r.dailyCost,r.currency)+'\/cat\/day'+(r.cats>1?' \u00b7 '+mfMoney(r.dailyCost*r.cats,r.currency)+'\/household\/day':'')+' \u00b7 based on food consumed.');\n mfOut('checkout-cost',mfMoney(r.totalCheckout,r.currency));mfOut('checkout-note','Starting with no food in stock. Full packs are rounded up; leftovers carry forward.');mfShopping(r);\n const warnings=mfFind('[data-out=\"warnings\"]');warnings.replaceChildren();r.warnings.forEach(text=>mfParagraph(warnings,text));\n if(r.wet.units>0&&Math.abs(r.wet.units-Math.round(r.wet.units))>.001)mfParagraph(warnings,'This plan uses part of a wet-food container. Follow its storage instructions for leftovers; package duration is arithmetic, not safe storage time.');\n if(r.wet.cost100!==null||r.dry.cost100!==null){const lines=[];if(r.wet.cost100!==null)lines.push('Wet '+mfMoney(r.wet.cost100,r.currency));if(r.dry.cost100!==null)lines.push('dry '+mfMoney(r.dry.cost100,r.currency));mfParagraph(warnings,'Cost per 100 kcal: '+lines.join(' \u00b7 ')+'. This compares energy cost only, not diet quality.');}\n mfCompare(input,r);mfFind('[data-role=\"status\"]').textContent='Plan updated: '+mfWetText(r)+' wet and '+mfDryText(r)+' dry per cat, per day.';\n}\nfunction mfBuild(scroll=true){\n mfFind('[data-role=\"error\"]').hidden=true;mfRoot.querySelectorAll('[aria-invalid=true]').forEach(el=>{el.removeAttribute('aria-invalid');el.removeAttribute('aria-errormessage');});\n try{const input=mfRead(),r=mfCalculate(input);mfRender(r,input);if(scroll)mfFind('.mf-receipt').scrollIntoView({behavior:'auto',block:'start'});}\n catch(e){mfClear();const error=mfFind('[data-role=\"error\"]');error.id='mf-error';error.hidden=false;error.textContent=e.message||'Check the values and try again.';const field=mfFind('#'+e.field);if(field){const hiddenDetails=field.closest('details');if(hiddenDetails)hiddenDetails.open=true;field.setAttribute('aria-invalid','true');field.setAttribute('aria-errormessage','mf-error');field.focus();}else error.scrollIntoView({block:'center'});}\n}\nfunction mfSummary(){\n if(!mfLast)return '';const r=mfLast.result,i=mfLast.input;\n const lines=['SNUGGLESOULS \u2014 MIXED FEEDING WORKSHEET',mfDemo?'EXAMPLE-BASED INPUTS: verify all food labels and prices.':'User-entered food labels and calorie target.',\n  (i.catName?'Cat: '+i.catName+'. ':'')+'Per cat per day: '+mfFmt(r.target)+' kcal total; '+mfFmt(r.treats)+' treat kcal; '+mfFmt(r.budget)+' food kcal.',\n  'Wet'+(i.wetName?' ('+i.wetName+')':'')+': '+mfWetText(r)+' ('+mfFmt(r.wet.grams,1)+' g), '+mfFmt(r.wet.calories,1)+' kcal.',\n  'Dry'+(i.dryName?' ('+i.dryName+')':'')+': '+mfDryText(r)+(r.dry.cups!==null&&r.dry.grams!==null?' ('+mfFmt(r.dry.cups,3)+' label cups)':'')+', '+mfFmt(r.dry.calories,1)+' kcal.',\n  'Wet food label: '+(i.wetKcal||'unused')+' kcal\/'+i.wetBasis+'; one unit '+(i.wetWeight||'unused')+' '+i.wetWeightUnit+'.',\n  'Dry food label: '+(i.dryKcal||'unused')+' kcal\/'+i.dryBasis+(i.dryBasis==='cup'?'; '+(i.dryCupGrams||'unknown')+' g\/cup':'')+'.',\n  'Wet pack: '+(i.wetPrice===''?'price not entered':i.wetPrice+' '+r.currency)+' \/ '+i.wetPack+' units.',\n  'Dry bag: '+(i.dryPrice===''?'price not entered':i.dryPrice+' '+r.currency)+' \/ '+(i.dryBagWeight||'unknown')+' '+i.dryBagUnit+'.',\n  'Budget: '+r.days+' days, '+r.cats+' cat'+(r.cats===1?'':'s')+' with the same daily plan.',\n  'Food consumed cost: '+mfMoney(r.totalUsedCost,r.currency)+'. Whole-pack checkout: '+mfMoney(r.totalCheckout,r.currency)+'.',\n  mfFind('[data-out=\"shopping-list\"]').innerText,\n  'Treat purchases, tax, shipping and waste excluded. Starts with no inventory; leftovers retained safely per label. Rounded portions are approximate; calculations use unrounded amounts.',\n  ...r.warnings,'This is label arithmetic, not a veterinary diet prescription.','https:\/\/snugglesouls.com\/wet-dry-cat-food-calculator\/'];return lines.join('\\n');\n}\nfunction mfPrint(){\n const text=mfSummary();if(!text)return;const popup=window.open('about:blank','_blank');if(!popup){mfFind('[data-role=\"status\"]').textContent='Allow pop-ups to open the printable plan.';return;}\n const doc=popup.document;doc.open();doc.write('<!doctype html>');doc.close();doc.documentElement.lang='en';doc.title='Mixed Feeding Plan | SnuggleSouls';\n const style=doc.createElement('style');style.textContent='body{max-width:760px;margin:36px auto;padding:0 20px;font:15px\/1.7 Arial,sans-serif;color:#152d30}pre{white-space:pre-wrap;font:inherit;overflow-wrap:anywhere}button{padding:12px 18px;margin-bottom:20px}@media print{button{display:none}}';doc.head.append(style);\n const h=doc.createElement('h1');h.textContent='Mixed Feeding Plan';const b=doc.createElement('button');b.textContent='Print \/ Save as PDF';b.addEventListener('click',()=>popup.print());const pre=doc.createElement('pre');pre.textContent=text;doc.body.replaceChildren(h,b,pre);popup.opener=null;\n}\nmfForm.addEventListener('submit',e=>{e.preventDefault();mfBuild();});\nmfForm.addEventListener('input',e=>{mfTouched=true;if(e.target.name==='target'){mfFind('[data-role=\"target-source\"]').hidden=true;}if(e.target.id==='mf-slider')mfForm.elements.share.value=e.target.value;mfClear();mfSync();});\nmfForm.addEventListener('change',()=>{mfTouched=true;mfClear();mfSync();});\nmfRoot.addEventListener('click',async e=>{\n const use=e.target.closest('[data-use-share]');if(use){mfForm.elements.mode.value='ratio';mfForm.elements.share.value=use.dataset.useShare;mfSync();mfBuild();return;}\n const button=e.target.closest('[data-action]');if(!button)return;\n if(button.dataset.action==='reset'){mfForm.reset();mfDemo=false;mfTouched=false;mfFind('[data-role=\"demo-note\"]').hidden=true;mfFind('[data-role=\"target-source\"]').hidden=true;mfClear();mfSync();mfForm.elements.target.focus();}\n if(button.dataset.action==='example'){\n  mfForm.reset();const values={target:240,treats:20,share:50,wetKcal:100,wetWeight:85,dryKcal:4000,wetPrice:18,wetPack:12,dryPrice:20,dryBagWeight:2,days:30,cats:1,meals:2};Object.entries(values).forEach(([key,value])=>mfForm.elements[key].value=value);mfDemo=true;mfTouched=true;mfFind('[data-role=\"demo-note\"]').hidden=false;mfFind('[data-role=\"target-source\"]').hidden=true;mfSync();mfBuild();\n }\n if(button.dataset.action==='import-handoff'&&mfPendingHandoff){mfApplyHandoff(mfPendingHandoff);return;}\n if(button.dataset.action==='dismiss-handoff'){mfPendingHandoff=null;mfFind('[data-role=\"handoff-note\"]').hidden=true;return;}\n if(button.dataset.action==='create-sitter-sheet'&&mfLast){\n  const r=mfLast.result,i=mfLast.input,catName=String(i.catName||'').trim();\n  const foodLines=['Feeding worksheet from the owner \u2014 review these amounts, times and food instructions before sharing.','Per cat per day: '+mfFmt(r.target,1)+' kcal total; '+mfFmt(r.budget,1)+' kcal from food; '+mfFmt(r.treats,1)+' kcal for treats and extras.'];\n  if(r.wet.calories>0)foodLines.push('Wet'+(i.wetName?' ('+i.wetName+')':'')+': '+mfWetText(r)+' per day ('+mfFmt(r.wet.grams,1)+' g; '+mfFmt(r.wet.calories,1)+' kcal).');\n  if(r.dry.calories>0)foodLines.push('Dry'+(i.dryName?' ('+i.dryName+')':'')+': '+mfDryText(r)+(r.dry.cups!==null&&r.dry.grams!==null?' ('+mfFmt(r.dry.cups,3)+' label cups)':'')+' per day ('+mfFmt(r.dry.calories,1)+' kcal).');\n  const mealWet=r.wet.calories>0?mfWetText(r,r.meals)+' wet':'',mealDry=r.dry.calories>0?mfDryText(r,r.meals)+' dry':'';\n  foodLines.push('Arithmetic only: if divided evenly across '+r.meals+' meals, serve '+[mealWet,mealDry].filter(Boolean).join(' + ')+' per cat, per meal. Confirm the actual meal times and whether foods are served together or separately.');\n  foodLines.push('Confirm the serving location, allowed extras, and what to do with leftovers. Follow the current package storage directions.');\n  if(r.cats>1)foodLines.push('The worksheet counted '+r.cats+' cats using this same per-cat plan. Add each cat by name and confirm their individual instructions before repeating it.');\n  const treatLine='Treats & extras: the worksheet sets aside '+mfFmt(r.treats,1)+' kcal per cat per day. Confirm which treats and amounts the sitter may give; do not treat this calorie note as an itemized treat list.';\n  const packet={version:1,flow:'mixed-to-sitter',createdAt:Date.now(),example:mfDemo,values:{catName:catName,food:foodLines.join('\\n'),limits:treatLine}};\n  try{sessionStorage.setItem('snugglesouls.mixed-to-sitter.v1',JSON.stringify(packet));window.location.assign('https:\/\/snugglesouls.com\/cat-sitter-instructions-generator\/#cs-builder');}\n  catch(error){mfFind('[data-role=\"status\"]').textContent='Your browser could not pass these values. Keep this plan open and copy the food amounts into the sitter sheet manually.';}\n  return;\n }\n if(button.dataset.action==='copy'&&mfLast){try{await navigator.clipboard.writeText(mfSummary());mfFind('[data-role=\"status\"]').textContent='Plan copied, including labels, prices and assumptions.';}catch(e){mfFind('[data-role=\"status\"]').textContent='Clipboard unavailable. Open Print plan to copy the plain-text version.';}}\n if(button.dataset.action==='print')mfPrint();\n});\nmfSync();mfRoot.dataset.initialized='true';mfFind('[data-ready]').disabled=false;mfShowHandoff(mfConsumeHandoff());\n\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Wet &amp; Dry Cat Food Calculator Calculate wet and dry cat food portions, compare feeding costs, and plan purchases using your food labels and daily calorie target. Build your feeding plan \u2198 Portions &amp; costCompare ratiosRead your labelsHow the math worksFAQs FROM LABEL TO BOWL Build one day. Budget the rest. Load an example Enter [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":8246,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-8247","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/snugglesouls.com\/de\/wp-json\/wp\/v2\/pages\/8247","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/snugglesouls.com\/de\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/snugglesouls.com\/de\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/snugglesouls.com\/de\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/snugglesouls.com\/de\/wp-json\/wp\/v2\/comments?post=8247"}],"version-history":[{"count":5,"href":"https:\/\/snugglesouls.com\/de\/wp-json\/wp\/v2\/pages\/8247\/revisions"}],"predecessor-version":[{"id":8296,"href":"https:\/\/snugglesouls.com\/de\/wp-json\/wp\/v2\/pages\/8247\/revisions\/8296"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/snugglesouls.com\/de\/wp-json\/wp\/v2\/media\/8246"}],"wp:attachment":[{"href":"https:\/\/snugglesouls.com\/de\/wp-json\/wp\/v2\/media?parent=8247"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}