{"id":8251,"date":"2026-10-20T08:57:25","date_gmt":"2026-10-20T08:57:25","guid":{"rendered":"https:\/\/snugglesouls.com\/?page_id=8251"},"modified":"2026-10-21T11:55:16","modified_gmt":"2026-10-21T11:55:16","slug":"cat-weight-tracker","status":"publish","type":"page","link":"https:\/\/snugglesouls.com\/de\/cat-weight-tracker\/","title":{"rendered":"Cat Weight Tracker &#038; Body Condition Log"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"8251\" class=\"elementor elementor-8251 elementor-bc-flex-widget\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-eed5e2a e-con-full e-flex e-con e-parent\" data-id=\"eed5e2a\" 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-60f7614 elementor-widget elementor-widget-html\" data-id=\"60f7614\" 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-weight-tracker{--wt-ink:#18332d;--wt-muted:#4e635c;--wt-rule:#cfddd6;--wt-paper:#fff;--wt-soft:#edf5f0;--wt-accent:#123f34;--wt-plum:#123f34;--wt-green:#123f34;background:var(--wt-paper);color:var(--wt-ink);font:inherit;font-size:16px;line-height:1.65;text-align:left;overflow-wrap:anywhere;color-scheme:light}\n#ss-weight-tracker *{box-sizing:border-box}\n#ss-weight-tracker [hidden]{display:none!important}\n#ss-weight-tracker h1,#ss-weight-tracker h2,#ss-weight-tracker h3,#ss-weight-tracker p,#ss-weight-tracker figure{margin:0}\n#ss-weight-tracker h1,#ss-weight-tracker h2,#ss-weight-tracker h3{font-family:inherit;color:var(--wt-ink);font-weight:700;letter-spacing:-.025em;line-height:1.2}\n#ss-weight-tracker h1{font-size:clamp(32px,3.6vw,49px);margin-bottom:19px}\n#ss-weight-tracker h1 span{font-size:.76em;font-weight:500}\n#ss-weight-tracker h2{font-size:clamp(26px,2.8vw,34px)}\n#ss-weight-tracker h3{font-size:22px}\n#ss-weight-tracker a{color:var(--wt-green);text-underline-offset:4px}\n#ss-weight-tracker a:hover{text-decoration:underline}\n#ss-weight-tracker button,#ss-weight-tracker input,#ss-weight-tracker select,#ss-weight-tracker textarea{font:inherit;letter-spacing:normal}\n#ss-weight-tracker button{cursor:pointer}\n#ss-weight-tracker button:disabled{opacity:.55;cursor:not-allowed}\n#ss-weight-tracker :is(button,a,input,select,textarea,summary,[tabindex]):focus-visible{outline:3px solid #24765e;outline-offset:3px}\n#ss-weight-tracker .wt-wrap{max-width:1200px;margin-inline:auto;padding-inline:28px}\n#ss-weight-tracker .wt-intro{display:grid;grid-template-columns:minmax(0,1.5fr) minmax(0,1fr);gap:64px;align-items:center;padding-block:44px 34px}\n#ss-weight-tracker .wt-lead{font-size:18px;line-height:1.65;color:var(--wt-muted);max-width:530px}\n#ss-weight-tracker .wt-intro-photo{width:100%;max-width:380px;justify-self:end;border-radius:12px;overflow:hidden;background:var(--wt-soft)}\n#ss-weight-tracker .wt-intro-photo img{display:block;width:100%;height:242px;object-fit:cover}\n#ss-weight-tracker .wt-actions{display:flex;align-items:center;flex-wrap:wrap;gap:12px 22px}\n#ss-weight-tracker .wt-intro .wt-actions{margin-top:24px}\n#ss-weight-tracker .wt-button,#ss-weight-tracker .wt-secondary,#ss-weight-tracker .wt-upload,#ss-weight-tracker .wt-toolbar button{display:inline-flex;align-items:center;justify-content:center;min-height:46px;padding:11px 20px;background:var(--wt-green);border:1px solid var(--wt-green);border-radius:7px;color:#fff;text-decoration:none;font-size:14px;font-weight:700;line-height:1.45;box-shadow:none}\n#ss-weight-tracker .wt-button:hover,#ss-weight-tracker .wt-toolbar button:hover{background:#215747;color:#fff;text-decoration:none}\n#ss-weight-tracker .wt-secondary,#ss-weight-tracker .wt-upload{background:#fff;color:var(--wt-green);border-color:#8fa89b;font-weight:600;padding:10px 15px}\n#ss-weight-tracker .wt-secondary:hover,#ss-weight-tracker .wt-upload:hover{background:var(--wt-soft);color:var(--wt-green)}\n#ss-weight-tracker .wt-text-button{display:inline-block;background:transparent;border:0;border-radius:4px;min-height:44px;padding:9px 0;color:var(--wt-green);font-size:14px;font-weight:600;text-decoration:underline;text-underline-offset:4px;line-height:1.6}\n#ss-weight-tracker button:active,#ss-weight-tracker .wt-button:active{transform:translateY(1px)}\n#ss-weight-tracker .wt-small{font-size:13px;color:var(--wt-muted);line-height:1.65}\n#ss-weight-tracker .wt-page-nav{display:flex;gap:12px 28px;flex-wrap:wrap;border-block:1px solid var(--wt-rule);padding-block:15px;font-size:14px}\n#ss-weight-tracker .wt-page-nav a{text-decoration:none;font-weight:600}\n#ss-weight-tracker .wt-workspace{padding-block:35px 52px;scroll-margin-top:24px}\n#ss-weight-tracker .wt-workspace-heading{display:flex;align-items:center;justify-content:space-between;gap:22px}\n#ss-weight-tracker .wt-workspace-heading h2{font-size:30px}\n#ss-weight-tracker .wt-workspace-note{font-size:13px;color:var(--wt-muted);margin-top:8px;margin-bottom:24px}\n#ss-weight-tracker label{display:block;font-size:14px;font-weight:600;color:var(--wt-ink)}\n#ss-weight-tracker input:not([type=radio]):not([type=file]),#ss-weight-tracker select,#ss-weight-tracker textarea{display:block;width:100%;min-width:0;min-height:46px;padding:10px 12px;border:1px solid #90a89a;border-radius:6px;background:#fff;color:var(--wt-ink);font-size:15px;line-height:1.45;margin-top:7px;box-shadow:none;font-weight:400}\n#ss-weight-tracker input::placeholder,#ss-weight-tracker textarea::placeholder{color:#63766b;opacity:1}\n#ss-weight-tracker input[aria-invalid=true],#ss-weight-tracker select[aria-invalid=true]{border-color:#a43d2a}\n#ss-weight-tracker textarea{resize:vertical}\n#ss-weight-tracker fieldset{border:0;padding:0;margin:0;min-width:0}\n#ss-weight-tracker .wt-toolbar{display:grid;grid-template-columns:minmax(180px,1fr) minmax(240px,1.25fr) auto;align-items:start;gap:24px;padding:22px 24px;background:var(--wt-soft);border:1px solid var(--wt-rule);border-radius:10px}\n#ss-weight-tracker .wt-new-cat{min-width:0;padding-top:23px}\n#ss-weight-tracker summary{cursor:pointer;color:var(--wt-green);font-weight:600;font-size:14px;line-height:1.6;padding:10px 0}\n#ss-weight-tracker .wt-new-cat>summary{padding-top:7px;min-height:46px}\n#ss-weight-tracker .wt-new-cat form{padding-top:12px}\n#ss-weight-tracker .wt-new-cat .wt-small{margin-top:9px}\n#ss-weight-tracker .wt-inline{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;margin-top:7px}\n#ss-weight-tracker .wt-inline input{margin:0!important}\n#ss-weight-tracker .wt-inline button{padding-inline:14px;font-size:13px;white-space:nowrap}\n#ss-weight-tracker .wt-units legend{font-size:13px;color:var(--wt-muted);margin-bottom:7px;font-weight:600}\n#ss-weight-tracker .wt-units label{display:inline-flex;align-items:center;gap:7px;min-height:46px;padding:9px 12px;border:1px solid #90a89a;border-radius:6px;background:#fff;font-size:14px}\n#ss-weight-tracker .wt-units label:has(input:checked){background:var(--wt-green);border-color:var(--wt-green);color:#fff}\n#ss-weight-tracker input[type=radio]{accent-color:var(--wt-green);width:15px;height:15px;margin:0}\n#ss-weight-tracker .wt-profile-message{margin:10px 0 15px}\n#ss-weight-tracker .wt-profile-message:empty{margin:0;height:20px}\n#ss-weight-tracker .wt-board{display:flex;flex-direction:column;gap:26px;min-width:0}\n#ss-weight-tracker .wt-entry{width:100%;border:1px solid var(--wt-rule);border-radius:10px;background:#fff;scroll-margin-top:24px}\n#ss-weight-tracker .wt-entry-heading{display:flex;align-items:center;gap:14px;padding:20px 24px;list-style:none}\n#ss-weight-tracker .wt-entry-heading::-webkit-details-marker{display:none}\n#ss-weight-tracker .wt-plus{width:32px;height:32px;display:grid;place-items:center;background:var(--wt-soft);border-radius:6px;font-size:25px;font-weight:400;line-height:1}\n#ss-weight-tracker .wt-entry h3{font-size:20px;margin-bottom:3px}\n#ss-weight-tracker .wt-entry-toggle{margin-left:auto;font-size:12px;color:var(--wt-muted);white-space:nowrap}\n#ss-weight-tracker .wt-entry[open]>.wt-entry-heading{background:var(--wt-soft);border-bottom:1px solid var(--wt-rule);border-radius:10px 10px 0 0}\n#ss-weight-tracker .wt-entry[open] .wt-plus{background:#fff}\n#ss-weight-tracker .wt-entry form{padding:26px 28px}\n#ss-weight-tracker .wt-entry-fields{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:36px}\n#ss-weight-tracker .wt-measure-fields{display:grid;grid-template-columns:1fr 1fr;gap:18px}\n#ss-weight-tracker .wt-entry-basics>label{margin-top:22px}\n#ss-weight-tracker .wt-entry .wt-small{margin-top:8px}\n#ss-weight-tracker .wt-optional{font-size:12px;color:var(--wt-muted);font-weight:400;float:right}\n#ss-weight-tracker .wt-weight-input{position:relative}\n#ss-weight-tracker .wt-weight-input input{padding-right:45px!important}\n#ss-weight-tracker .wt-weight-input span{position:absolute;right:14px;top:12px;font-size:14px;font-weight:400}\n#ss-weight-tracker .wt-score-fields{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-top:15px}\n#ss-weight-tracker .wt-bcs-help{margin-top:10px}\n#ss-weight-tracker .wt-bcs-help p{font-size:14px;margin-block:10px}\n#ss-weight-tracker .wt-entry-details{border:1px solid var(--wt-rule);border-radius:7px;padding:4px 16px;margin-bottom:20px}\n#ss-weight-tracker .wt-entry-details label{margin:12px 0 18px}\n#ss-weight-tracker .wt-entry-observations>label{margin-top:16px}\n#ss-weight-tracker .wt-entry textarea{min-height:130px}\n#ss-weight-tracker .wt-entry-footer{display:flex;align-items:center;flex-wrap:wrap;gap:12px 20px;padding-top:20px;margin-top:20px;border-top:1px solid var(--wt-rule)}\n#ss-weight-tracker .wt-entry-footer .wt-save{min-width:180px}\n#ss-weight-tracker .wt-form-message{font-size:14px;line-height:1.65;color:var(--wt-green);margin-top:14px}\n#ss-weight-tracker .wt-form-message:empty{margin:0}\n#ss-weight-tracker .wt-timeline{width:100%;min-width:0;padding:28px;border:1px solid var(--wt-rule);border-radius:10px;background:#fff}\n#ss-weight-tracker .wt-chart-heading{display:flex;justify-content:space-between;align-items:start;gap:20px}\n#ss-weight-tracker .wt-chart-heading h3{font-size:24px}\n#ss-weight-tracker .wt-chart-heading p{margin-top:5px}\n#ss-weight-tracker .wt-chart-heading label{font-size:12px;min-width:150px}\n#ss-weight-tracker .wt-chart-heading select{font-size:14px}\n#ss-weight-tracker .wt-date-range{display:flex;flex-wrap:wrap;gap:14px;align-items:end;max-width:680px;margin-top:20px}\n#ss-weight-tracker .wt-date-range label{flex:1;min-width:130px}\n#ss-weight-tracker .wt-metrics{display:grid;grid-template-columns:1fr 1.15fr 1fr;gap:24px;padding:22px 0;margin-top:22px;border-block:1px solid var(--wt-rule)}\n#ss-weight-tracker .wt-metrics>div{padding-right:18px;border-right:1px solid var(--wt-rule)}\n#ss-weight-tracker .wt-metrics>div:last-child{border:0;padding-right:0}\n#ss-weight-tracker .wt-metrics span{display:block;font-size:13px;color:var(--wt-muted)}\n#ss-weight-tracker .wt-metrics strong{display:block;font-size:32px;font-weight:600;line-height:1.5;letter-spacing:-.035em;color:var(--wt-green);font-variant-numeric:tabular-nums}\n#ss-weight-tracker .wt-metrics small{display:block;font-size:12px;color:var(--wt-muted);line-height:1.6}\n#ss-weight-tracker .wt-chart{width:100%;min-width:0;margin-top:24px}\n#ss-weight-tracker .wt-chart svg{display:block;width:100%;height:auto;max-height:380px}\n#ss-weight-tracker .wt-chart svg text{font-family:inherit;font-size:11px;fill:var(--wt-muted)}\n#ss-weight-tracker .wt-chart svg .wt-axis-title{font-weight:700;fill:var(--wt-ink);letter-spacing:.06em}\n#ss-weight-tracker .wt-chart-legend{display:flex;flex-wrap:wrap;gap:10px 22px;font-size:12px;color:var(--wt-muted);margin-top:18px}\n#ss-weight-tracker .wt-chart-legend span{display:flex;gap:7px;align-items:center}\n#ss-weight-tracker .wt-dot{display:inline-block;width:9px;height:9px;border-radius:50%;background:var(--wt-green)}\n#ss-weight-tracker .wt-square{display:inline-block;width:9px;height:9px;border:1.5px solid #3b6c56}\n#ss-weight-tracker .wt-solid{background:#3b6c56}\n#ss-weight-tracker .wt-chart-note{border-top:1px solid var(--wt-rule);margin-top:18px;padding-top:5px}\n#ss-weight-tracker .wt-chart-note p{max-width:850px;padding-bottom:12px}\n#ss-weight-tracker .wt-empty-actions{padding:20px 22px;background:var(--wt-soft);border-radius:7px;margin-top:20px}\n#ss-weight-tracker .wt-empty-actions p{font-size:14px;margin-bottom:12px}\n#ss-weight-tracker .wt-context-strip:empty{display:none}\n#ss-weight-tracker .wt-context-strip{border-top:1px solid var(--wt-rule);padding-top:20px;margin-top:12px}\n#ss-weight-tracker .wt-context-strip h4{font-family:inherit;font-size:12px;line-height:1.5;font-weight:600;color:var(--wt-muted);margin:0 0 14px;letter-spacing:.04em}\n#ss-weight-tracker .wt-event{display:inline-block;vertical-align:top;width:50%;padding:0 24px 0 16px;border-left:2px solid #8fa89b;font-size:13px;margin-bottom:16px}\n#ss-weight-tracker .wt-event time{font-size:12px;color:var(--wt-muted)}\n#ss-weight-tracker .wt-event p{margin-top:5px}\n#ss-weight-tracker .wt-demo-banner{display:flex;align-items:center;gap:16px;padding:16px 20px;margin-top:20px;margin-bottom:18px;border:1px solid #8fa89b;border-radius:8px;background:var(--wt-soft);font-size:13px}\n#ss-weight-tracker .wt-demo-banner strong{white-space:nowrap;font-size:12px}\n#ss-weight-tracker .wt-demo-banner button{border:1px solid var(--wt-green);border-radius:6px;min-height:44px;padding:8px 12px;background:#fff;color:var(--wt-green);font-size:13px;flex-shrink:0}\n#ss-weight-tracker .wt-warning{background:#fff4df;border:1px solid #aa753c;color:#563a1d;padding:16px;margin-block:18px;border-radius:7px;font-size:14px}\n#ss-weight-tracker .wt-history{padding-top:34px;scroll-margin-top:24px}\n#ss-weight-tracker .wt-history-heading{display:flex;align-items:center;justify-content:space-between;gap:20px;flex-wrap:wrap;margin-bottom:20px}\n#ss-weight-tracker .wt-history-heading .wt-small{margin-top:5px}\n#ss-weight-tracker .wt-history-heading .wt-actions{gap:10px}\n#ss-weight-tracker .wt-table-scroll{overflow:auto;max-width:100%;border:1px solid var(--wt-rule);border-radius:8px}\n#ss-weight-tracker table{border-collapse:collapse;width:100%;font-size:14px;background:#fff;margin:0;line-height:1.6}\n#ss-weight-tracker th,#ss-weight-tracker td{text-align:left;vertical-align:top;padding:15px 16px;border:0;border-bottom:1px solid var(--wt-rule);background:transparent;color:var(--wt-ink)}\n#ss-weight-tracker th{font-size:12px;font-weight:700;background:var(--wt-soft)}\n#ss-weight-tracker tbody tr:last-child td{border-bottom:0}\n#ss-weight-tracker td:first-child{white-space:nowrap}\n#ss-weight-tracker td small{display:block;font-size:12px;color:var(--wt-muted)}\n#ss-weight-tracker td details{min-width:135px;max-width:340px}\n#ss-weight-tracker td summary{font-size:13px;padding:3px 0}\n#ss-weight-tracker td p{font-size:13px;white-space:pre-wrap;margin-top:10px}\n#ss-weight-tracker td button{min-height:40px!important;padding:7px 0!important;font-size:13px!important;margin-right:14px}\n#ss-weight-tracker .wt-data-tools{border-block:1px solid var(--wt-rule);margin-top:30px;padding:12px 0}\n#ss-weight-tracker .wt-data-tools>summary{font-size:16px}\n#ss-weight-tracker .wt-data-grid{display:grid;grid-template-columns:1fr 1fr;gap:40px;padding:20px 0}\n#ss-weight-tracker .wt-data-grid h3{font-size:20px}\n#ss-weight-tracker .wt-data-grid p{font-size:14px;margin-block:12px}\n#ss-weight-tracker .wt-upload{position:relative;overflow:hidden;cursor:pointer}\n#ss-weight-tracker .wt-upload:focus-within{outline:3px solid #24765e;outline-offset:3px}\n#ss-weight-tracker .wt-upload input{position:absolute;inset:0;opacity:0;cursor:pointer;width:100%}\n#ss-weight-tracker .wt-danger{display:block;margin-top:15px;border:0;background:transparent;color:#943d29;text-decoration:underline;font-size:13px;min-height:44px;padding:8px 0}\n#ss-weight-tracker .wt-editorial{max-width:1144px;margin:0 auto;padding:44px 0;border-top:1px solid var(--wt-rule);scroll-margin-top:24px}\n#ss-weight-tracker .wt-editorial h2{margin-bottom:24px;font-size:30px}\n#ss-weight-tracker .wt-editorial h3{font-size:20px;margin:22px 0 12px}\n#ss-weight-tracker .wt-editorial p{font-size:15px;line-height:1.8;margin-block:12px}\n#ss-weight-tracker .wt-editorial-grid{display:grid;grid-template-columns:1.1fr 1fr;gap:52px}\n#ss-weight-tracker .wt-editorial-grid>div{min-width:0}\n#ss-weight-tracker .wt-numbered{list-style:none;padding:0;counter-reset:weigh;margin:0}\n#ss-weight-tracker .wt-numbered li{counter-increment:weigh;position:relative;padding:0 0 22px 40px}\n#ss-weight-tracker .wt-numbered li:before{content:counter(weigh);position:absolute;left:0;top:0;width:26px;height:26px;display:grid;place-items:center;background:var(--wt-soft);color:var(--wt-green);border-radius:6px;font-size:14px;font-weight:700}\n#ss-weight-tracker .wt-numbered h3{margin:0 0 6px}\n#ss-weight-tracker .wt-numbered p{margin:0;font-size:14px}\n#ss-weight-tracker .wt-note-panel{align-self:start;background:var(--wt-soft);border-radius:10px;padding:26px}\n#ss-weight-tracker .wt-note-panel h3:first-child{margin-top:0}\n#ss-weight-tracker .wt-formula{border-left:3px solid var(--wt-green);padding:5px 20px;background:var(--wt-soft);margin-block:22px;font-variant-numeric:tabular-nums}\n#ss-weight-tracker .wt-link-list{list-style:none;margin:0;padding:0}\n#ss-weight-tracker .wt-link-list li{padding:16px 0;border-bottom:1px solid var(--wt-rule)}\n#ss-weight-tracker .wt-link-list a{font-weight:600}\n#ss-weight-tracker .wt-link-list p{font-size:14px;margin:6px 0 0}\n#ss-weight-tracker .wt-faq details{border-bottom:1px solid var(--wt-rule);padding-block:8px}\n#ss-weight-tracker .wt-faq summary{font-size:16px;color:var(--wt-ink);padding-right:20px}\n#ss-weight-tracker .wt-faq details p{font-size:14px;max-width:900px;margin:5px 0 16px}\n#ss-weight-tracker .wt-source-list{font-size:14px;line-height:1.8;padding-left:22px}\n#ss-weight-tracker .wt-source-list li{margin-block:10px}\n#ss-weight-tracker .wt-sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0)}\n@media(max-width:1024px){#ss-weight-tracker .wt-intro{gap:32px}#ss-weight-tracker .wt-toolbar{grid-template-columns:minmax(160px,1fr) minmax(220px,1.2fr) auto;gap:18px}#ss-weight-tracker .wt-timeline{padding:24px}#ss-weight-tracker .wt-editorial{margin-inline:28px}#ss-weight-tracker .wt-entry-fields{gap:26px}#ss-weight-tracker .wt-entry form{padding:24px}}\n@media(max-width:767px){#ss-weight-tracker .wt-wrap{padding-inline:20px}#ss-weight-tracker .wt-intro{grid-template-columns:1fr 210px;gap:25px;padding-block:30px}#ss-weight-tracker h1{font-size:34px}#ss-weight-tracker .wt-intro-photo img{height:215px}#ss-weight-tracker .wt-lead{font-size:16px}#ss-weight-tracker .wt-toolbar{grid-template-columns:minmax(0,1fr) auto;padding:18px;gap:16px}#ss-weight-tracker .wt-new-cat{grid-column:1\/-1;grid-row:2;padding:0}#ss-weight-tracker .wt-units{grid-column:2;grid-row:1}#ss-weight-tracker .wt-entry-fields{grid-template-columns:1fr;gap:24px}#ss-weight-tracker .wt-entry-observations{border-top:1px solid var(--wt-rule);padding-top:22px}#ss-weight-tracker .wt-entry-details{margin-bottom:18px}#ss-weight-tracker .wt-metrics{gap:16px}#ss-weight-tracker .wt-metrics strong{font-size:28px}#ss-weight-tracker .wt-metrics span{font-size:12px}#ss-weight-tracker .wt-editorial-grid,#ss-weight-tracker .wt-data-grid{grid-template-columns:1fr;gap:26px}#ss-weight-tracker .wt-editorial{margin-inline:20px;padding-block:34px}#ss-weight-tracker .wt-event{width:100%;padding-right:0}}\n@media(max-width:540px){#ss-weight-tracker .wt-wrap{padding-inline:18px}#ss-weight-tracker .wt-intro{grid-template-columns:1fr;gap:24px;padding-top:28px}#ss-weight-tracker h1{font-size:34px;margin-bottom:16px}#ss-weight-tracker .wt-intro-photo{max-width:none;justify-self:stretch}#ss-weight-tracker .wt-intro-photo img{height:210px;object-position:center top}#ss-weight-tracker .wt-intro .wt-actions{gap:10px 18px;margin-top:20px}#ss-weight-tracker .wt-page-nav{gap:12px 22px;font-size:13px}#ss-weight-tracker .wt-workspace{padding-top:28px}#ss-weight-tracker .wt-workspace-heading{align-items:start;flex-direction:column;gap:14px}#ss-weight-tracker .wt-workspace-heading h2{font-size:27px}#ss-weight-tracker .wt-workspace-heading .wt-button{width:100%}#ss-weight-tracker .wt-workspace-note{margin-top:14px}#ss-weight-tracker .wt-toolbar{gap:16px 12px}#ss-weight-tracker .wt-units label{padding-inline:9px}#ss-weight-tracker .wt-units legend{font-size:12px}#ss-weight-tracker .wt-inline{grid-template-columns:1fr}#ss-weight-tracker .wt-entry-heading{padding:18px 16px;gap:11px}#ss-weight-tracker .wt-entry-heading .wt-small{font-size:12px}#ss-weight-tracker .wt-entry-toggle{display:none}#ss-weight-tracker .wt-entry h3{font-size:19px}#ss-weight-tracker .wt-entry form{padding:20px 16px}#ss-weight-tracker .wt-measure-fields{grid-template-columns:1fr;gap:18px}#ss-weight-tracker .wt-entry-footer .wt-save{width:100%}#ss-weight-tracker .wt-timeline{padding:20px 16px}#ss-weight-tracker .wt-chart-heading{flex-direction:column;gap:16px}#ss-weight-tracker .wt-chart-heading h3{font-size:23px}#ss-weight-tracker .wt-chart-heading label{width:100%}#ss-weight-tracker .wt-metrics{grid-template-columns:1fr 1fr;gap:16px;padding:18px 0}#ss-weight-tracker .wt-metrics>div{padding-right:8px}#ss-weight-tracker .wt-metrics>div:nth-child(2){border:0;padding-right:0}#ss-weight-tracker .wt-metrics>div:last-child{grid-column:1\/-1;border-top:1px solid var(--wt-rule);padding-top:14px}#ss-weight-tracker .wt-metrics strong{font-size:27px}#ss-weight-tracker .wt-chart{margin-top:20px}#ss-weight-tracker .wt-chart-legend{gap:12px;font-size:12px}#ss-weight-tracker .wt-chart svg text{font-size:12px}#ss-weight-tracker .wt-empty-actions{padding:18px 15px}#ss-weight-tracker .wt-demo-banner{flex-wrap:wrap;gap:12px}#ss-weight-tracker .wt-demo-banner span{order:3;flex-basis:100%}#ss-weight-tracker .wt-demo-banner button{margin-left:auto}#ss-weight-tracker .wt-history-heading .wt-actions{width:100%;gap:10px}#ss-weight-tracker .wt-history-heading .wt-secondary{flex:1;font-size:12px;padding:10px}#ss-weight-tracker .wt-table-scroll table{min-width:640px}#ss-weight-tracker .wt-editorial{margin-inline:18px}#ss-weight-tracker .wt-editorial h2{font-size:27px}#ss-weight-tracker .wt-note-panel{padding:22px}#ss-weight-tracker .wt-data-grid .wt-actions{gap:12px}}\n@media(min-width:768px) and (max-width:1024px){body:has(#ss-weight-tracker) .elementor-element-dcfe3ff .elementor-button{padding-inline:8px;max-width:100%;box-sizing:border-box}}\n@media(prefers-reduced-motion:reduce){#ss-weight-tracker *,#ss-weight-tracker *:before,#ss-weight-tracker *:after{scroll-behavior:auto!important;transition:none!important;animation:none!important}}\n\n\n\/* Tool photo banner: owner-approved shared header treatment. *\/\n#ss-weight-tracker 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-weight-tracker .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-weight-tracker .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-weight-tracker 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-weight-tracker .ss-tool-banner-copy{position:relative;z-index:1;min-width:0;width:100%;max-width:650px}\n#ss-weight-tracker .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-weight-tracker .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-weight-tracker .ss-tool-banner-actions{display:flex;align-items:center;flex-wrap:wrap;gap:12px 16px;margin-top:25px}\n#ss-weight-tracker .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-weight-tracker .ss-tool-banner .ss-tool-banner-actions>:first-child{background:#fff;color:#123f34}\n#ss-weight-tracker .ss-tool-banner .ss-tool-banner-actions>:is(a,button):hover{background:#edf5f0;color:#123f34;text-decoration:none}\n#ss-weight-tracker .ss-tool-banner :is(a,button):focus-visible{outline:3px solid #fff;outline-offset:4px}\n#ss-weight-tracker header.ss-tool-banner[data-align=right]{justify-content:flex-end}\n#ss-weight-tracker .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-weight-tracker 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-weight-tracker header.ss-tool-banner{padding:36px;min-height:390px}#ss-weight-tracker .ss-tool-banner-copy{max-width:610px}#ss-weight-tracker .ss-tool-banner h1{font-size:42px}#ss-weight-tracker .ss-tool-banner-copy>p{max-width:520px}#ss-weight-tracker 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-weight-tracker 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-weight-tracker header.ss-tool-banner{padding:30px 26px;min-height:370px}#ss-weight-tracker .ss-tool-banner .ss-tool-banner-media{width:100%;mask-image:none}#ss-weight-tracker .ss-tool-banner h1{font-size:36px}#ss-weight-tracker .ss-tool-banner-copy>p{font-size:17px}#ss-weight-tracker header.ss-tool-banner:after,#ss-weight-tracker header.ss-tool-banner[data-align=right]:after{background:linear-gradient(90deg,rgba(10,38,29,.88),rgba(10,38,29,.75))}#ss-weight-tracker .ss-tool-banner .ss-tool-banner-media img{object-position:var(--banner-mobile-position,center)}}\n@media(max-width:540px){#ss-weight-tracker header.ss-tool-banner{min-height:360px;padding:28px 22px;border-radius:8px}#ss-weight-tracker .ss-tool-banner h1{font-size:34px;line-height:1.17}#ss-weight-tracker .ss-tool-banner-copy>p{font-size:16px;line-height:1.7;margin-top:18px}#ss-weight-tracker .ss-tool-banner-actions{gap:10px;margin-top:22px}#ss-weight-tracker .ss-tool-banner .ss-tool-banner-actions>:is(a,button){font-size:13px;padding:10px 13px;min-height:45px}}\n\n@media(min-width:768px){#ss-weight-tracker .ss-tool-banner-media{width:62%}#ss-weight-tracker .ss-tool-banner .ss-tool-banner-media img{object-position:center top}}\n\n#ss-weight-tracker header.ss-tool-banner{width:auto;max-width:1144px;margin:36px auto 28px}\n@media(max-width:1200px){#ss-weight-tracker header.ss-tool-banner{margin-inline:28px}}\n@media(max-width:767px){#ss-weight-tracker header.ss-tool-banner{margin:26px 20px}}\n@media(max-width:540px){#ss-weight-tracker header.ss-tool-banner{margin:24px 18px}}\n\n<\/style>\n<main id=\"ss-weight-tracker\" data-presentation=\"weight-journal-green\">\n<header class=\"ss-tool-banner\" data-banner=\"photo-overlay-v1\" data-tool=\"weight\" data-align=\"left\" style=\"--banner-position:58% 48%;--banner-mobile-position:58% 48%\"><div class=\"ss-tool-banner-media\" aria-hidden=\"true\"><img fetchpriority=\"high\" src=\"https:\/\/snugglesouls.com\/wp-content\/uploads\/2026\/09\/cat-food-switch-log-weekly-weight-check.webp\" srcset=\"https:\/\/snugglesouls.com\/wp-content\/uploads\/2026\/09\/cat-food-switch-log-weekly-weight-check-768x512.webp 768w, https:\/\/snugglesouls.com\/wp-content\/uploads\/2026\/09\/cat-food-switch-log-weekly-weight-check.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>Cat Weight Tracker &amp; Body Condition Log<\/h1><p>Record weight, follow changes, and keep body condition notes in one place.<\/p><div class=\"ss-tool-banner-actions\"><a class=\"wt-button\" href=\"#wt-entry\" data-action=\"open-entry\">Start a weight log<\/a><button type=\"button\" class=\"wt-text-button\" data-action=\"demo\">Explore an example<\/button><\/div><\/div><\/header>\n<nav class=\"wt-page-nav wt-wrap\" aria-label=\"On this page\"><a href=\"#wt-workspace\">Your tracker<\/a><a href=\"#wt-weigh-guide\">How to weigh a cat<\/a><a href=\"#wt-bcs-guide\">Understanding BCS<\/a><a href=\"#wt-faq\">Questions &amp; answers<\/a><\/nav>\n<section class=\"wt-workspace wt-wrap\" id=\"wt-workspace\" aria-labelledby=\"wt-workspace-title\">\n <div class=\"wt-workspace-heading\"><div><h2 id=\"wt-workspace-title\">Your cat\u2019s weight journal<\/h2><\/div><a href=\"#wt-entry\" class=\"wt-button\" data-action=\"open-entry\">+ Add a check-in<\/a><\/div>\n <p class=\"wt-workspace-note\">Free to use. No account needed. Save records in this browser and download a backup to keep a copy.<\/p>\n <noscript><p class=\"wt-warning\">Enable JavaScript to use the local tracker. The weighing guide and reference links below remain available.<\/p><\/noscript>\n <p class=\"wt-warning\" data-role=\"storage-status\" role=\"status\" hidden><\/p>\n <div class=\"wt-demo-banner\" data-role=\"demo-banner\" hidden><strong>EXAMPLE DATA<\/strong><span>This history is fictional. It is not a target or recommended weight trend and will not be saved.<\/span><button type=\"button\" data-action=\"exit-demo\">Back to my cats<\/button><\/div>\n <div class=\"wt-toolbar\"><label class=\"wt-profile-label\" for=\"wt-profile\">Your cat<select id=\"wt-profile\" data-role=\"profiles\"><option value=\"\">Choose or create a cat<\/option><\/select><\/label><details class=\"wt-new-cat\" data-role=\"new-cat\"><summary>+ New cat<\/summary><form data-role=\"cat-form\"><label for=\"wt-cat-name\">Cat\u2019s name<\/label><div class=\"wt-inline\"><input id=\"wt-cat-name\" name=\"catName\" required maxlength=\"60\" autocomplete=\"off\" placeholder=\"e.g. Luna\"><button type=\"submit\" disabled data-enable>Create profile<\/button><\/div><p class=\"wt-small\">A separate history for each cat. Names and saved check-ins stay in this browser.<\/p><\/form><\/details><fieldset class=\"wt-units\"><legend>Weight unit<\/legend><label><input type=\"radio\" name=\"wt-unit\" value=\"kg\" checked>kg<\/label><label><input type=\"radio\" name=\"wt-unit\" value=\"lb\">lb<\/label><\/fieldset><\/div>\n <p class=\"wt-small wt-profile-message\" data-role=\"profile-message\" role=\"status\"><\/p>\n <div class=\"wt-board\">\n  <details class=\"wt-entry\" id=\"wt-entry\" aria-labelledby=\"wt-entry-title\">\n   <summary class=\"wt-entry-heading\"><span class=\"wt-plus\" aria-hidden=\"true\">+<\/span><div><h3 id=\"wt-entry-title\">Add a check-in<\/h3><p class=\"wt-small\" data-role=\"entry-caption\">A weight, a score, or a dated observation.<\/p><\/div><span class=\"wt-entry-toggle\" aria-hidden=\"true\">Open \/ close<\/span><\/summary>\n   <form data-role=\"entry-form\">\n    <div class=\"wt-entry-fields\"><div class=\"wt-entry-basics\"><div class=\"wt-measure-fields\">\n    <label for=\"wt-date\">Check-in date<input id=\"wt-date\" name=\"date\" type=\"date\" required><\/label>\n    <label for=\"wt-weight\">Measured weight <span class=\"wt-optional\">optional<\/span><div class=\"wt-weight-input\"><input id=\"wt-weight\" name=\"weight\" type=\"number\" step=\"any\" inputmode=\"decimal\" placeholder=\"e.g. 4.5\"><span data-out=\"unit\">kg<\/span><\/div><\/label>\n    <\/div><p class=\"wt-small\">Subtract the empty carrier or container before entering the weight.<\/p>\n    <label for=\"wt-source\">Body condition score (BCS)<select id=\"wt-source\" name=\"source\"><option value=\"none\">Not scored \/ I\u2019m not sure<\/option><option value=\"owner\">My estimate on a 9-point scale<\/option><option value=\"vet\">Veterinary-team score, entered by me<\/option><\/select><\/label>\n    <div class=\"wt-score-fields\" data-role=\"score-fields\" hidden><label for=\"wt-low\">Score out of 9<select id=\"wt-low\" name=\"low\"><option value=\"\">Choose<\/option><option>1<\/option><option>2<\/option><option>3<\/option><option>4<\/option><option>5<\/option><option>6<\/option><option>7<\/option><option>8<\/option><option>9<\/option><\/select><\/label><label for=\"wt-high\" data-role=\"upper-field\">Unsure? Upper score<select id=\"wt-high\" name=\"high\"><option value=\"\">Exact score<\/option><option>2<\/option><option>3<\/option><option>4<\/option><option>5<\/option><option>6<\/option><option>7<\/option><option>8<\/option><option>9<\/option><\/select><\/label><\/div>\n    <details class=\"wt-bcs-help\"><summary>What is BCS? How do I choose?<\/summary><p>BCS describes fat covering on a 1\u20139 scale. Gently feel the ribs, then look at the waist from above and the abdomen from the side. Stop if handling is uncomfortable.<\/p><p><a href=\"\/cat-bmi-weight-calculator\/#bc-score-check\" target=\"_blank\" rel=\"noopener\">Open the illustrated score guide \u2197<\/a>, or compare the <a href=\"https:\/\/wsava.org\/wp-content\/uploads\/2025\/06\/WSAVA_BCSCat_BCSCat_Nutrition_250612.pdf\" target=\"_blank\" rel=\"noopener\">official WSAVA chart (PDF)<\/a>. Return here to enter a score.<\/p><p>Choose an exact score, two neighboring scores if uncertain, or leave it unscored. Weight alone cannot determine BCS. Do not enter a score from a 5-point scale as a score out of 9.<\/p><button type=\"button\" class=\"wt-text-button\" data-action=\"unscored\">Keep this check unscored<\/button><\/details>\n    <\/div><div class=\"wt-entry-observations\"><details class=\"wt-entry-details\"><summary>Add weighing method &amp; context<\/summary><label for=\"wt-method\">Weighing method<select id=\"wt-method\" name=\"method\"><option value=\"unknown\">Not recorded<\/option><option value=\"pet\">Pet \/ baby scale<\/option><option value=\"carrier\">Carrier minus empty carrier<\/option><option value=\"held\">Person + cat minus person<\/option><option value=\"clinic\">Clinic scale<\/option><option value=\"other\">Other \u2014 describe in notes<\/option><\/select><\/label><label for=\"wt-event\">Context marker<select id=\"wt-event\" name=\"event\"><option value=\"routine\">Routine check<\/option><option value=\"food\">Food \/ portion change<\/option><option value=\"vet\">Vet visit<\/option><option value=\"appetite\">Appetite \/ health observation<\/option><option value=\"other\">Other event<\/option><\/select><\/label><label for=\"wt-appetite\">Appetite observation<select id=\"wt-appetite\" name=\"appetite\"><option value=\"unknown\">Not recorded<\/option><option value=\"usual\">Usual for this cat<\/option><option value=\"less\">Eating less than usual<\/option><option value=\"more\">Eating more than usual<\/option><option value=\"none\">Not eating \u2014 contact a vet promptly<\/option><\/select><\/label><label for=\"wt-muscle\">Muscle condition note<select id=\"wt-muscle\" name=\"muscle\"><option value=\"unknown\">Not assessed<\/option><option value=\"concern\">I have a concern \u2014 discuss with vet<\/option><option value=\"vet\">Assessed by vet \u2014 details in notes<\/option><\/select><\/label><\/details>\n    <label for=\"wt-notes\">Notes <span class=\"wt-optional\">optional<\/span><textarea id=\"wt-notes\" name=\"notes\" rows=\"3\" maxlength=\"2000\" placeholder=\"Scale used, food changes, appetite, or questions for your vet\u2026\"><\/textarea><\/label>\n    <\/div><\/div><p class=\"wt-small\" data-role=\"imported-context\" hidden>Imported assessment details are retained with this entry and included in exports.<\/p>\n    <p class=\"wt-form-message\" data-role=\"entry-message\" role=\"status\" tabindex=\"-1\"><\/p>\n    <div class=\"wt-entry-footer\"><button type=\"submit\" class=\"wt-button wt-save\" disabled data-enable>Save check-in<\/button><button type=\"button\" class=\"wt-text-button\" data-action=\"cancel-edit\" hidden>Cancel edit<\/button><button type=\"button\" class=\"wt-secondary\" data-action=\"view-trend\">View timeline<\/button><\/div>\n    <p class=\"wt-small\">Choose Save check-in to store your entry. If this cat already has an entry for that date, you will be asked before replacing it.<\/p>\n   <\/form>\n  <\/details>\n  <section class=\"wt-timeline\" aria-labelledby=\"wt-timeline-title\">\n   <div class=\"wt-chart-heading\"><div><h3 id=\"wt-timeline-title\"><span data-out=\"cat-name\">Your cat<\/span>\u2019s timeline<\/h3><p class=\"wt-small\">Recorded weight above. Optional body condition scores below.<\/p><\/div><label for=\"wt-period\">Show<select id=\"wt-period\"><option value=\"all\">All entries<\/option><option value=\"90\">Last 90 days<\/option><option value=\"365\">Last 365 days<\/option><option value=\"custom\">Date range<\/option><\/select><\/label><\/div>\n   <div class=\"wt-date-range\" data-role=\"date-range\" hidden><label for=\"wt-from\">From<input id=\"wt-from\" type=\"date\"><\/label><label for=\"wt-to\">Through<input id=\"wt-to\" type=\"date\"><\/label><button type=\"button\" class=\"wt-secondary\" data-action=\"apply-range\">Apply dates<\/button><\/div>\n   <p class=\"wt-small\" data-role=\"range-message\" role=\"status\"><\/p>\n   <div class=\"wt-metrics\" data-role=\"metrics\"><div><span>Latest weight in view<\/span><strong>\u2014<\/strong><small>No saved weigh-ins<\/small><\/div><div><span>Change in view<\/span><strong>\u2014<\/strong><small>Add two dated weights<\/small><\/div><div><span>Latest BCS in view<\/span><strong>\u2014<\/strong><small>Scoring is optional<\/small><\/div><\/div>\n   <div class=\"wt-chart\" data-role=\"chart\"><\/div>\n   <div class=\"wt-empty-actions\" data-role=\"empty-actions\"><p>Add your first dated weight, or explore a fictional example to see how the timeline works.<\/p><div class=\"wt-actions\"><button type=\"button\" class=\"wt-secondary\" data-action=\"open-entry\">Add first check-in<\/button><button type=\"button\" class=\"wt-text-button\" data-action=\"demo\">See an example timeline<\/button><\/div><\/div>\n   <div class=\"wt-chart-legend\"><span><i class=\"wt-dot\"><\/i>Recorded weight<\/span><span><i class=\"wt-square\"><\/i>Owner BCS estimate<\/span><span><i class=\"wt-square wt-solid\"><\/i>Vet-team BCS, entered by you<\/span><\/div>\n   <details class=\"wt-chart-note\"><summary>How to read this chart<\/summary><p class=\"wt-small\">The weight axis zooms to your entries. Lines connect measured weights; no daily values are inferred. BCS points and ranges are shown only where entered. The chart describes recorded changes; it does not assign a health rating.<\/p><\/details>\n   <div class=\"wt-context-strip\" data-role=\"events\"><\/div>\n  <\/section>\n\n <\/div>\n <section class=\"wt-history\" aria-labelledby=\"wt-history-title\"><div class=\"wt-history-heading\"><div><h3 id=\"wt-history-title\">Check-in history<\/h3><p class=\"wt-small\" data-out=\"history-caption\">Exact entries and context behind your chart.<\/p><\/div><div class=\"wt-actions\"><button type=\"button\" class=\"wt-secondary\" data-action=\"csv\">Export this view (CSV)<\/button><button type=\"button\" class=\"wt-secondary\" data-action=\"print\">Print this view \/ PDF<\/button><\/div><\/div><div class=\"wt-table-scroll\" tabindex=\"0\" role=\"region\" aria-label=\"Dated cat measurements; scroll horizontally on small screens\"><table><caption class=\"wt-sr\">Recorded weights, body condition scores, context and editing actions<\/caption><thead><tr><th scope=\"col\">Date<\/th><th scope=\"col\">Weight<\/th><th scope=\"col\">BCS \/ 9<\/th><th scope=\"col\">Context<\/th><th scope=\"col\">Entry<\/th><\/tr><\/thead><tbody data-role=\"rows\"><tr><td colspan=\"5\">Create a cat profile, then add your first check-in.<\/td><\/tr><\/tbody><\/table><\/div><button type=\"button\" class=\"wt-text-button\" data-action=\"more\" hidden>Show more entries<\/button><p role=\"status\" class=\"wt-form-message\" data-role=\"history-message\"><\/p><button type=\"button\" class=\"wt-text-button\" data-action=\"undo\" hidden>Undo last deletion<\/button><\/section>\n <details class=\"wt-data-tools\"><summary>Back up, restore &amp; manage profiles<\/summary><div class=\"wt-data-grid\"><div><h3>Keep a copy you control<\/h3><p>Back up all cats to an editable JSON file. CSV and print cover the selected cat and displayed date range. A backup contains all cats and dates.<\/p><div class=\"wt-actions\"><button type=\"button\" class=\"wt-secondary\" data-action=\"backup\">Back up all cats (JSON)<\/button><label class=\"wt-upload\" for=\"wt-import\">Import a tracker backup<input id=\"wt-import\" type=\"file\" accept=\".json,application\/json\"><\/label><\/div><p class=\"wt-small\">Imports create separate profiles; they never replace your existing cats. Files are read in your browser.<\/p><\/div><div><h3>Already used our BCS tool?<\/h3><p>Copy its locally saved profiles into this tracker, on the same website and browser. Original BCS records stay in their own tool.<\/p><button type=\"button\" class=\"wt-secondary\" data-action=\"legacy\">Copy saved BCS profiles<\/button><p class=\"wt-small\">This is a one-time copy, not a live connection. Repeating it creates another copy.<\/p><button type=\"button\" class=\"wt-danger\" data-action=\"delete-cat\">Delete selected profile<\/button><\/div><\/div><p class=\"wt-small\">No account or cloud sync is provided. The tracker does not send your entries to our server. Browser clearing, private browsing or a different device may make local records unavailable. Download backups regularly. <a href=\"\/privacy-policy\/\">Site privacy policy<\/a>.<\/p><\/details>\n<\/section>\n<div class=\"wt-wrap\">\n<section class=\"wt-editorial\" id=\"wt-weigh-guide\" aria-labelledby=\"wt-weigh-title\"><h2 id=\"wt-weigh-title\">How to track your cat\u2019s weight at home<\/h2><div class=\"wt-editorial-grid\"><div><ol class=\"wt-numbered\"><li><h3>Use a repeatable weighing setup<\/h3><p>Use a stable, suitable scale and the same method where possible. Follow its instructions for zeroing and capacity. Keep your cat comfortable; do not force a weigh-in.<\/p><\/li><li><h3>Record the cat\u2019s weight, not the carrier<\/h3><p>Subtract the empty carrier or container if it is included in the reading. A person-plus-cat reading minus the person\u2019s weight can be less precise; label the method so it is not confused with a clinic or pet scale.<\/p><\/li><li><h3>Save the date and what was different<\/h3><p>Note a scale change, different weighing conditions, food change or appetite observation. A small difference may reflect the weighing setup or scale resolution. Keep only as many decimal places as the scale supports.<\/p><\/li><li><h3>Choose a review schedule with your vet<\/h3><p>Use the interval appropriate for your cat\u2019s age, health and care plan. Do not wait for the next scheduled entry if you are concerned about a change.<\/p><\/li><\/ol><\/div><aside class=\"wt-note-panel\"><h3>Need a printable cat weight chart?<\/h3><p>Print the selected cat\u2019s history, including its graph and notes, or start with a blank weight log for handwritten checks.<\/p><button type=\"button\" class=\"wt-secondary\" data-action=\"blank\">Print a blank weight log<\/button><p class=\"wt-small\">The print dialog can save a PDF. A printed report is a snapshot; use the JSON backup to keep an editable copy.<\/p><h3>What should a cat weight log include?<\/h3><p>A useful entry has a date, weight with its unit, the scale or method used, and relevant observations. Add a BCS when you have one. \u201cNot scored\u201d is more useful than a guessed number.<\/p><\/aside><\/div><\/section>\n<section class=\"wt-editorial\" id=\"wt-bcs-guide\" aria-labelledby=\"wt-bcs-title\"><h2 id=\"wt-bcs-title\">Why record body condition as well as weight?<\/h2><div class=\"wt-editorial-grid\"><div><h3>The scale records weight. BCS describes fat covering.<\/h3><p>Body condition scoring uses appearance and gentle hands-on assessment. Different frames and muscle condition mean the same weight can have different interpretations. A weight chart alone cannot tell you whether a cat is overweight. <a href=\"#wt-references\">[1, 2]<\/a><\/p><p>This tracker keeps BCS on its own 1\u20139 scale. It preserves an exact score or two neighboring scores, identifies an owner estimate separately from a veterinary-team score entered by you, and leaves missing scores blank.<\/p><p><a href=\"\/cat-bmi-weight-calculator\/#bc-score-check\">Use the illustrated cat body condition guide<\/a> if you want help understanding the numbers. You can return and enter the score, or keep the check unscored.<\/p><\/div><div><h3>Fat covering and muscle condition are separate<\/h3><p>Body condition is not a muscle assessment. Keep muscle concerns in your notes and discuss them with your veterinary team, including when weight looks unchanged. Nutritional assessment should be individualized. <a href=\"#wt-references\">[2, 3]<\/a><\/p><p>Growing kittens, senior cats and cats with a medical condition need particular context. This tool does not plot a breed-based growth percentile or supply a universal \u201cideal cat weight.\u201d<\/p><p><a href=\"https:\/\/wsava.org\/wp-content\/uploads\/2025\/06\/WSAVA_BCSCat_BCSCat_Nutrition_250612.pdf\" target=\"_blank\" rel=\"noopener\">Compare the official WSAVA 9-point cat BCS chart (PDF) \u2197<\/a><\/p><\/div><\/div><\/section>\n<section class=\"wt-editorial\" aria-labelledby=\"wt-change-title\"><h2 id=\"wt-change-title\">Is my cat gaining or losing weight?<\/h2><div class=\"wt-editorial-grid\"><div><p>The timeline shows the measurements you recorded, spaced by their actual calendar dates. The change compares the first and last measured weights <strong>inside your selected date range<\/strong>. A BCS-only entry does not count as a zero weight.<\/p><div class=\"wt-formula\"><p><strong>Weight change = last weight \u2212 first weight<\/strong><br>Percentage change = change \u00f7 first weight \u00d7 100<\/p><\/div><p>For example, 4.50 kg followed by 4.40 kg is \u22120.10 kg, or approximately \u22122.22% relative to 4.50 kg. This arithmetic does not say whether the change is appropriate for an individual cat.<\/p><p>Unit conversion uses <strong>1 lb = 0.45359237 kg<\/strong>. Records are stored in kilograms; switching the display changes presentation rather than replacing the original recorded measurements.<\/p><\/div><aside class=\"wt-note-panel\"><h3>A change is a prompt to review<\/h3><p>Check dates, units and the weighing method. Look at appetite, body condition, muscle concerns and your cat\u2019s agreed care plan together. A food-change marker records timing; it does not prove that the food caused a weight change.<\/p><p>Contact your veterinary team about unexplained weight changes or reduced appetite. If your cat is not eating, seek veterinary advice promptly. A stable line on the chart does not rule out a health problem. <a href=\"#wt-references\">[2, 3]<\/a><\/p><p>This tracker does not prescribe calories, set a target weight, calculate a safe weight-loss rate or predict when a goal will be reached.<\/p><\/aside><\/div><\/section>\n<section class=\"wt-editorial\" aria-labelledby=\"wt-next-title\"><h2 id=\"wt-next-title\">Put the next check-in in context<\/h2><div class=\"wt-editorial-grid\"><ul class=\"wt-link-list\"><li><a href=\"\/cat-bmi-weight-calculator\/\">Understand your cat\u2019s body condition score<\/a><p>Compare observations and the 9-point scale before entering an estimate.<\/p><\/li><li><a href=\"\/is-my-cat-healthy-bcs-mcs-guide\/\">Understand body and muscle condition<\/a><p>Learn why a BCS score and MCS observation answer different questions.<\/p><\/li><li><a href=\"\/wet-dry-cat-food-calculator\/\">Plan measured wet and dry food portions<\/a><p>Work from your cat\u2019s appropriate calorie target and the actual food labels.<\/p><\/li><li><a href=\"\/cat-calorie-calculator\/\">Review a daily calorie and feeding estimate<\/a><p>Keep the feeding plan separate from the descriptive weight log.<\/p><\/li><\/ul><ul class=\"wt-link-list\"><li><a href=\"\/cat-food-switch-log\/\">Keep a cat food switch log<\/a><p>Record appetite, stool and recipe changes alongside the weight history.<\/p><\/li><li><a href=\"\/how-to-adjust-mixed-feeding-indoor-cats-weight-gain\/\">Review mixed feeding when an indoor cat gains weight<\/a><p>Bring meals, treats and other sources of food into the conversation.<\/p><\/li><li><a href=\"\/transition-overweight-cat-free-feeding-measured-meals\/\">Move from free feeding to measured meals<\/a><p>Use a consistent household routine and an individual veterinary plan.<\/p><\/li><\/ul><\/div><\/section>\n<section class=\"wt-editorial wt-faq\" id=\"wt-faq\" aria-labelledby=\"wt-faq-title\"><h2 id=\"wt-faq-title\">Cat weight tracking questions<\/h2><details><summary>How often should I weigh my cat?<\/summary><p>There is no single interval for every cat. Ask your veterinary team for a schedule suited to age, health and any weight-management plan. The tracker accepts irregular check-ins and spaces them by their real dates; it does not require a daily or weekly entry.<\/p><\/details><details><summary>Can I use this as a cat weight loss tracker?<\/summary><p>Yes, to document measured changes and the plan your veterinary team has agreed with you. It does not label a loss rate safe, set a calorie deficit or predict a goal date. Keep food, appetite and muscle concerns with the record.<\/p><\/details><details><summary>Can I record a weight without knowing my cat\u2019s BCS?<\/summary><p>Yes. Leave \u201cNot scored \/ I\u2019m not sure\u201d selected and save the weight. You can also save a BCS without a weight, or a dated observation without either. Missing measurements are not turned into zeroes.<\/p><\/details><details><summary>What does a BCS range such as 5\u20136 mean?<\/summary><p>It records your uncertainty between two neighboring scores on a 9-point scale. The tracker keeps both numbers and shows the span; it does not convert them into a score of 5.5. Your veterinary team can help confirm the assessment.<\/p><\/details><details><summary>Can I use the log for a kitten or senior cat?<\/summary><p>You can record their measured weights and observations, including weights down to 0.01 kg. The lower input limit is a data-entry limit, not a normal or healthy weight. There are no automatic growth percentiles, breed targets or adult BCS judgments. Ask your veterinary team how to interpret the history.<\/p><\/details><details><summary>Does this work in pounds and kilograms?<\/summary><p>Yes. Choose kg or lb before entering a measurement. Switching units also converts an unsaved weight field and the chart. CSV includes both units; the print report uses your selected display unit.<\/p><\/details><details><summary>Can I track several cats and move records to another device?<\/summary><p>Keep up to 20 separate profiles with 500 entries each. Download \u201cBack up all cats (JSON)\u201d and import that file on the other device. There is no automatic sync. An import makes separate copies so existing profiles are preserved.<\/p><\/details><details><summary>Can I bring records over from the SnuggleSouls BCS tool?<\/summary><p>Open \u201cBack up, restore &amp; manage profiles\u201d and choose \u201cCopy saved BCS profiles\u201d on the same website and browser. This copies dated weights, selected scores and assessment context. It does not update or delete the original BCS profiles, and later changes are not synchronized.<\/p><\/details><details><summary>What happens if I add two entries for the same day?<\/summary><p>The tracker keeps one entry per cat per date. It asks before replacing a saved entry on that date. Use Edit to correct a record. Deletion has an Undo snapshot for the current visit; download a backup before major changes.<\/p><\/details><details><summary>Where is my cat\u2019s information saved?<\/summary><p>Profile creation and \u201cSave check-in\u201d store data in this browser when local storage is available. Entries are not uploaded by this tracker. Clearing browser data can remove them, and private browsing may not retain them. If saving fails, a notice tells you that changes are for this visit only; download a backup before leaving.<\/p><\/details><\/section>\n<section class=\"wt-editorial\" id=\"wt-references\" aria-labelledby=\"wt-method-title\"><h2 id=\"wt-method-title\">References for cat weight and body condition<\/h2><ol class=\"wt-source-list\"><li><a href=\"https:\/\/wsava.org\/wp-content\/uploads\/2025\/06\/WSAVA_BCSCat_BCSCat_Nutrition_250612.pdf\" target=\"_blank\" rel=\"noopener\">WSAVA: 9-point Cat Body Condition Score reference chart (2025, PDF)<\/a><\/li><li><a href=\"https:\/\/wsava.org\/global-guidelines\/global-nutrition-guidelines\/\" target=\"_blank\" rel=\"noopener\">WSAVA Global Nutrition Guidelines: body condition and muscle condition resources<\/a><\/li><li><a href=\"https:\/\/www.aaha.org\/resources\/2021-aaha-nutrition-and-weight-management-guidelines\/home\/\" target=\"_blank\" rel=\"noopener\">AAHA: 2021 Nutrition and Weight Management Guidelines for Dogs and Cats<\/a><\/li><\/ol><\/section>\n<\/div>\n\n<\/main>\n\n<script data-no-optimize=\"1\" data-cfasync=\"false\">\n(function(){\"use strict\";\nconst wtRoot=document.getElementById('ss-weight-tracker');\nif(!wtRoot||wtRoot.dataset.initialized)return;\nwtRoot.dataset.initialized='true';\nconst wtQ=r=>wtRoot.querySelector('[data-role=\"'+r+'\"]'),wtForm=wtQ('entry-form'),wtF=n=>wtForm.elements.namedItem(n);\nconst WT_KEY='snugglesouls.cat-weight-tracker.v1',WT_LEGACY='snugglesouls.body-condition-records.v1',WT_FACTOR=.45359237;\nconst WT_METHODS={unknown:'Not recorded',pet:'Pet \/ baby scale',carrier:'Carrier minus empty carrier',held:'Person + cat minus person',clinic:'Clinic scale',other:'Other \u2014 see notes'};\nconst WT_EVENTS={routine:'Routine check',food:'Food \/ portion change',vet:'Vet visit',appetite:'Appetite \/ health observation',other:'Other event'};\nconst WT_APPETITE={unknown:'Not recorded',usual:'Usual for this cat',less:'Eating less than usual',more:'Eating more than usual',none:'Not eating'};\nconst WT_MUSCLE={unknown:'Not assessed',concern:'Owner has a concern',vet:'Assessed by vet \u2014 see notes'};\nlet wtCats=[],wtActive='',wtUnit='kg',wtDemo=null,wtEdit='',wtContext='',wtDirty=false,wtUndo=null,wtLimit=12,wtStorageUnreadable=false;\nlet wtRange={kind:'all',from:'',to:''};\nconst wtEsc=s=>String(s).replace(\/[&<>\"']\/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'}[c]));\nconst wtFmt=(n,d=3)=>Number(n).toLocaleString('en-US',{maximumFractionDigits:d});\nconst wtSigned=(n,d=3)=>(n>0?'+':'')+wtFmt(n,d);\nfunction wtToday(){const d=new Date();return d.getFullYear()+'-'+String(d.getMonth()+1).padStart(2,'0')+'-'+String(d.getDate()).padStart(2,'0');}\nfunction wtOffset(days){const d=new Date();d.setDate(d.getDate()-days);return d.getFullYear()+'-'+String(d.getMonth()+1).padStart(2,'0')+'-'+String(d.getDate()).padStart(2,'0');}\nfunction wtId(){return globalThis.crypto?.randomUUID?crypto.randomUUID():Date.now().toString(36)+Math.random().toString(36).slice(2);}\nfunction wtDate(date){if(typeof date!=='string'||!\/^\\d{4}-\\d{2}-\\d{2}$\/.test(date)||date<'1900-01-01'||date>wtToday())return false;const n=Date.parse(date+'T00:00:00Z');return Number.isFinite(n)&&new Date(n).toISOString().slice(0,10)===date;}\nconst wtDays=(a,b)=>Math.round((Date.parse(b+'T00:00:00Z')-Date.parse(a+'T00:00:00Z'))\/86400000);\nfunction wtError(message,field){const e=new Error(message);e.field=field;throw e;}\nfunction wtRecord(r){\n if(!r||typeof r!=='object')wtError('An entry is not recognized.');\n if(!wtDate(r.date))wtError('Choose a valid check-in date, from 1900 through today.','date');\n if(r.kg!==null&&r.kg!==undefined&&r.kg!==''&&typeof r.kg!=='number')wtError('Stored weight must be a numeric kilogram value.');\n let kg=r.kg===null||r.kg===undefined||r.kg===''?null:r.kg;\n if(kg!==null&&(!Number.isFinite(kg)||kg<.01-1e-10||kg>30+1e-10))wtError('Enter a measured cat weight from 0.01 to 30 kg (about 0.022 to 66.139 lb). Check the unit and decimal point.','weight');\n if(kg!==null)kg=Math.min(30,Math.max(.01,kg));\n const source=r.source??'none';if(!['none','owner','vet'].includes(source))wtError('Choose a recognized score source.','source');\n let low=null,high=null;\n if(source!=='none'){\n  low=Number(r.low);high=r.high===null||r.high===undefined||r.high===''?low:Number(r.high);\n  if(!Number.isInteger(low)||low<1||low>9)wtError('Choose a body condition score from 1 to 9, or keep this check unscored.','low');\n  if(!Number.isInteger(high)||high<low||high>9||high-low>1)wtError('Use an exact score or two neighboring scores, such as 5\u20136.','high');\n  if(source==='vet'&&high!==low)wtError('Enter the exact veterinary-team score. Use \u201cMy estimate\u201d to record an uncertain range.','high');\n }\n const method=r.method??'unknown',event=r.event??'routine',appetite=r.appetite??'unknown',muscle=r.muscle??'unknown';\n if(!Object.hasOwn(WT_METHODS,method)||!Object.hasOwn(WT_EVENTS,event)||!Object.hasOwn(WT_APPETITE,appetite)||!Object.hasOwn(WT_MUSCLE,muscle))wtError('An entry contains an unrecognized context option.');\n const text=(v,max)=>{if(v==null)return '';if(typeof v!=='string'||v.length>max)wtError('An entry contains text that is too long or not recognized.');return v.trim();};\n const notes=text(r.notes,2000),context=text(r.context,4000);\n if(kg===null&&low===null&&!notes&&!context&&event==='routine'&&appetite==='unknown'&&muscle==='unknown')wtError('Add a weight, a score, or an observation before saving.','weight');\n return {id:typeof r.id==='string'&&r.id.length<120?r.id:wtId(),date:r.date,kg,source,low,high,method,event,appetite,muscle,notes,context};\n}\nfunction wtParseCats(data){\n if(!data||data.app!=='snugglesouls.cat-weight-tracker'||data.version!==1||!Array.isArray(data.cats)||data.cats.length>20)throw new Error('This is not a supported tracker backup (version 1, up to 20 cats).');\n const catIds=new Set();\n return data.cats.map(c=>{\n  if(!c||typeof c.name!=='string'||!c.name.trim()||c.name.length>60||typeof c.id!=='string'||c.id.length>120||catIds.has(c.id)||!Array.isArray(c.records)||c.records.length>500)throw new Error('A cat profile is invalid or exceeds the entry limit.');\n  catIds.add(c.id);const dates=new Set(),ids=new Set();\n  const records=c.records.map(r=>{const a=wtRecord(r);if(dates.has(a.date)||ids.has(a.id))throw new Error('A profile contains duplicate dates or entry IDs.');dates.add(a.date);ids.add(a.id);return a;});\n  return {id:c.id,name:c.name.trim(),records};\n });\n}\nconst wtPackage=()=>({app:'snugglesouls.cat-weight-tracker',version:1,exportedAt:new Date().toISOString(),cats:wtCats});\nfunction wtStorageMessage(text){wtQ('storage-status').textContent=text;wtQ('storage-status').hidden=false;}\nfunction wtPersist(){\n if(wtStorageUnreadable){wtStorageMessage('Existing tracker storage could not be read and has not been overwritten. New changes are kept for this visit only. Download a backup before leaving.');return false;}\n try{localStorage.setItem(WT_KEY,JSON.stringify(wtPackage()));wtQ('storage-status').hidden=true;return true;}\n catch(e){wtStorageMessage('Browser storage is unavailable or full. Your changes are kept for this visit only. Download a JSON backup before closing this tab.');return false;}\n}\nfunction wtCat(){return wtDemo||wtCats.find(c=>c.id===wtActive)||null;}\nfunction wtAll(){return (wtCat()?.records||[]).slice().sort((a,b)=>a.date.localeCompare(b.date));}\nfunction wtView(){return wtAll().filter(r=>(!wtRange.from||r.date>=wtRange.from)&&(!wtRange.to||r.date<=wtRange.to));}\nfunction wtScore(r){return r.low===null?'Not scored':(r.low===r.high?r.low:r.low+'\u2013'+r.high)+'\/9';}\nconst wtSource=r=>r.source==='owner'?'Owner estimate':r.source==='vet'?'Vet-team score, entered by you':'Unscored';\nconst wtWeight=r=>r.kg===null?'Not entered':wtFmt(wtUnit==='kg'?r.kg:r.kg\/WT_FACTOR)+' '+wtUnit;\nfunction wtSay(role,text){wtQ(role).textContent=text;}\nfunction wtDiscard(){return !wtDirty||window.confirm('Discard the unsaved check-in form changes? Saved entries will remain.');}\nfunction wtOpenEntry(){const panel=wtRoot.querySelector('#wt-entry');panel.open=true;panel.scrollIntoView({behavior:'instant',block:'start'});}\nfunction wtReset(){\n wtForm.reset();wtEdit='';wtContext='';wtDirty=false;wtF('date').value=wtToday();wtF('date').max=wtToday();\n wtQ('entry-caption').textContent='A weight, a score, or a dated observation.';\n wtRoot.querySelector('#wt-entry-title').textContent='Add a check-in';\n wtQ('score-fields').hidden=true;wtQ('upper-field').hidden=false;wtQ('imported-context').hidden=true;\n wtRoot.querySelector('[data-action=\"cancel-edit\"]').hidden=true;wtForm.querySelector('[type=submit]').textContent='Save check-in';\n wtSay('entry-message','');wtForm.querySelectorAll('[aria-invalid]').forEach(e=>e.removeAttribute('aria-invalid'));\n wtUpdateBounds();\n}\nfunction wtUpdateBounds(){wtF('weight').min=String(wtUnit==='kg'?.01:.01\/WT_FACTOR);wtF('weight').max=String(wtUnit==='kg'?30:30\/WT_FACTOR);wtRoot.querySelector('[data-out=\"unit\"]').textContent=wtUnit;}\nfunction wtProfiles(){\n const s=wtQ('profiles');s.innerHTML=wtDemo?'<option>Example cat \u00b7 fictional<\/option>':'<option value=\"\">Choose or create a cat<\/option>'+wtCats.map(c=>'<option value=\"'+wtEsc(c.id)+'\">'+wtEsc(c.name)+'<\/option>').join('');\n if(!wtDemo)s.value=wtActive;s.disabled=!!wtDemo;\n wtQ('demo-banner').hidden=!wtDemo;wtQ('cat-form').querySelectorAll('input,button').forEach(e=>e.disabled=!!wtDemo);\n wtForm.querySelectorAll('input,select,textarea,button[type=submit]').forEach(e=>e.disabled=!!wtDemo);\n if(wtDemo)wtQ('entry-caption').textContent='Read-only example. Return to your cats to record a check-in.';\n wtQ('new-cat').open=!wtDemo&&!wtCats.length;\n wtRoot.querySelector('[data-out=\"cat-name\"]').textContent=wtCat()?.name||'Your cat';\n wtQ('empty-actions').hidden=!!wtDemo||wtAll().length>0;\n}\nfunction wtMetrics(rows){\n const weights=rows.filter(r=>r.kg!==null),latest=weights.at(-1),first=weights[0],scored=rows.filter(r=>r.low!==null).at(-1);\n const data=[['Latest weight in view',latest?wtWeight(latest):'\u2014',latest?latest.date:'No recorded weights in view']];\n if(weights.length>1){const delta=latest.kg-first.kg,days=wtDays(first.date,latest.date);data.push(['Change in view',wtSigned(wtUnit==='kg'?delta:delta\/WT_FACTOR)+' '+wtUnit,wtSigned(delta\/first.kg*100,2)+'% \u00b7 '+days+' days \u00b7 vs '+first.date]);}\n else data.push(['Change in view','\u2014','Two dated weights are needed']);\n data.push(['Latest BCS in view',scored?wtScore(scored):'\u2014',scored?scored.date+' \u00b7 '+wtSource(scored):'Not scored; recording weight is enough']);\n wtQ('metrics').innerHTML=data.map(([a,b,c])=>'<div><span>'+wtEsc(a)+'<\/span><strong>'+wtEsc(b)+'<\/strong><small>'+wtEsc(c)+'<\/small><\/div>').join('');\n}\nfunction wtRenderChart(){\n const rows=wtView(),weighted=rows.filter(r=>r.kg!==null),scored=rows.filter(r=>r.low!==null),el=wtQ('chart');\n const W=Math.max(300,Math.min(980,Math.round(el.clientWidth||700))),H=340,L=W<450?48:58,R=18,top=33,base=199,bcsTop=242,bcsBase=300;\n const a=rows[0]?.date,b=rows.at(-1)?.date,span=a?wtDays(a,b):0;\n const x=d=>span?L+wtDays(a,d)\/span*(W-L-R):(L+W-R)\/2;\n const values=weighted.map(r=>wtUnit==='kg'?r.kg:r.kg\/WT_FACTOR),lo=values.length?Math.min(...values):0,hi=values.length?Math.max(...values):0,pad=Math.max((hi-lo)*.22,wtUnit==='kg'?.08:.18),min=Math.max(0,lo-pad),max=hi+pad;\n const y=n=>top+(max-n)\/(max-min)*(base-top),sy=n=>bcsBase-(n-1)\/8*(bcsBase-bcsTop);\n let s='<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 '+W+' '+H+'\" role=\"img\" aria-labelledby=\"wt-chart-title wt-chart-desc\"><title id=\"wt-chart-title\">'+wtEsc(wtCat()?.name||'Cat')+' weight and body condition timeline<\/title><desc id=\"wt-chart-desc\">'+wtEsc(rows.length?rows.length+' dated entries in this view. Weight and BCS have separate scales. Exact measurements and notes appear in the check-in history below.':'No entries yet. The empty grid is not example data.')+'<\/desc>';\n s+='<text class=\"wt-axis-title\" x=\"'+L+'\" y=\"14\">WEIGHT \/ '+wtUnit.toUpperCase()+'<\/text><text class=\"wt-axis-title\" x=\"'+L+'\" y=\"225\">BCS \/ 9<\/text>';\n [min,(min+max)\/2,max].forEach(n=>{const yy=y(n);s+='<line x1=\"'+L+'\" x2=\"'+(W-R)+'\" y1=\"'+yy+'\" y2=\"'+yy+'\" stroke=\"#cfddd6\"\/><text x=\"'+(L-8)+'\" y=\"'+(yy+4)+'\" text-anchor=\"end\">'+(weighted.length?wtFmt(n,wtUnit==='kg'?2:2):'\u2014')+'<\/text>';});\n [1,5,9].forEach(n=>s+='<line x1=\"'+L+'\" x2=\"'+(W-R)+'\" y1=\"'+sy(n)+'\" y2=\"'+sy(n)+'\" stroke=\"#e3ece7\"\/><text x=\"'+(L-8)+'\" y=\"'+(sy(n)+4)+'\" text-anchor=\"end\">'+n+'<\/text>');\n if(!weighted.length)s+='<text x=\"'+((L+W-R)\/2)+'\" y=\"112\" text-anchor=\"middle\">'+(rows.length?'No measured weights in this view':'Your first weigh-in starts here')+'<\/text>';\n const events=rows.filter(r=>r.event!=='routine');events.forEach(r=>s+='<line x1=\"'+x(r.date)+'\" x2=\"'+x(r.date)+'\" y1=\"'+top+'\" y2=\"'+base+'\" stroke=\"#718b7e\" stroke-opacity=\".5\" stroke-dasharray=\"3 5\"><title>'+wtEsc(r.date+': '+WT_EVENTS[r.event])+'<\/title><\/line>');\n if(weighted.length>1)s+='<polyline fill=\"none\" stroke=\"#123f34\" stroke-width=\"2.5\" stroke-linejoin=\"round\" points=\"'+weighted.map(r=>x(r.date)+','+y(wtUnit==='kg'?r.kg:r.kg\/WT_FACTOR)).join(' ')+'\"\/>';\n weighted.forEach(r=>s+='<circle cx=\"'+x(r.date)+'\" cy=\"'+y(wtUnit==='kg'?r.kg:r.kg\/WT_FACTOR)+'\" r=\"4\" stroke=\"#ffffff\" stroke-width=\"1.5\" fill=\"#123f34\"><title>'+wtEsc(r.date+': '+wtWeight(r))+'<\/title><\/circle>');\n scored.forEach(r=>{const xx=x(r.date),title='<title>'+wtEsc(r.date+': '+wtScore(r)+'; '+wtSource(r))+'<\/title>';if(r.high!==r.low){s+='<g stroke=\"#3b6c56\" stroke-width=\"2\">'+title+'<line x1=\"'+xx+'\" x2=\"'+xx+'\" y1=\"'+sy(r.low)+'\" y2=\"'+sy(r.high)+'\"\/><line x1=\"'+(xx-4)+'\" x2=\"'+(xx+4)+'\" y1=\"'+sy(r.low)+'\" y2=\"'+sy(r.low)+'\"\/><line x1=\"'+(xx-4)+'\" x2=\"'+(xx+4)+'\" y1=\"'+sy(r.high)+'\" y2=\"'+sy(r.high)+'\"\/><\/g>';}else s+='<rect x=\"'+(xx-3.5)+'\" y=\"'+(sy(r.low)-3.5)+'\" width=\"7\" height=\"7\" fill=\"'+(r.source==='vet'?'#3b6c56':'#ffffff')+'\" stroke=\"#3b6c56\" stroke-width=\"1.5\">'+title+'<\/rect>';});\n if(!scored.length)s+='<text x=\"'+((L+W-R)\/2)+'\" y=\"275\" text-anchor=\"middle\">No scored checks in view<\/text>';\n if(rows.length){const dates=span?[a,b]:[a];dates.forEach((d,i)=>s+='<text x=\"'+x(d)+'\" y=\"329\" text-anchor=\"'+(dates.length===1?'middle':i?'end':'start')+'\">'+d+'<\/text>');}\n s+='<\/svg>';el.innerHTML=s;\n}\nfunction wtEventText(r){return [WT_METHODS[r.method],r.appetite!=='unknown'?'Appetite: '+WT_APPETITE[r.appetite]:'',r.muscle!=='unknown'?'Muscle: '+WT_MUSCLE[r.muscle]:'',r.notes,r.context].filter(Boolean).join('\\n');}\nfunction wtRender(){\n wtProfiles();const rows=wtView();wtMetrics(rows);wtRenderChart();\n wtRoot.querySelector('[data-out=\"history-caption\"]').textContent=(wtCat()?.name||'No cat selected')+' \u00b7 '+rows.length+' of '+wtAll().length+' entries \u00b7 '+(wtRange.kind==='all'?'all dates':(wtRange.from||'start')+' through '+(wtRange.to||wtToday()));\n const entries=rows.slice().reverse().slice(0,wtLimit);\n wtQ('rows').innerHTML=entries.length?entries.map(r=>'<tr><td>'+r.date+'<\/td><td>'+wtEsc(wtWeight(r))+'<\/td><td>'+wtScore(r)+'<small>'+wtSource(r)+'<\/small><\/td><td><strong>'+WT_EVENTS[r.event]+'<\/strong><details><summary>Notes &amp; method<\/summary><p>'+wtEsc(wtEventText(r))+'<\/p><\/details><\/td><td>'+(wtDemo?'Example':'<button type=\"button\" class=\"wt-text-button\" data-action=\"edit\" data-id=\"'+wtEsc(r.id)+'\" aria-label=\"Edit entry '+r.date+'\">Edit<\/button><button type=\"button\" class=\"wt-text-button\" data-action=\"delete\" data-id=\"'+wtEsc(r.id)+'\" aria-label=\"Delete entry '+r.date+'\">Delete<\/button>')+'<\/td><\/tr>').join(''):'<tr><td colspan=\"5\">'+(wtCat()?'No entries in this view. Add a check-in or change the date range.':'Create a cat profile, then add your first check-in.')+'<\/td><\/tr>';\n wtRoot.querySelector('[data-action=\"more\"]').hidden=rows.length<=wtLimit;\n const events=rows.filter(r=>r.event!=='routine'||r.appetite==='none'||r.muscle==='concern').slice(-4).reverse();\n wtQ('events').innerHTML=events.length?'<h4>RECENT CONTEXT IN THIS VIEW<\/h4>'+events.map(r=>'<div class=\"wt-event\"><time>'+r.date+'<\/time><p><strong>'+WT_EVENTS[r.event]+'<\/strong>'+((r.appetite==='none'||r.muscle==='concern')?' \u00b7 '+wtEsc([r.appetite==='none'?'Not eating \u2014 contact a vet promptly':'',r.muscle==='concern'?'Muscle concern noted':''].filter(Boolean).join('; ')):'')+'<\/p>'+(r.notes?'<p>'+wtEsc(r.notes.length>200?r.notes.slice(0,197)+'\u2026':r.notes)+'<\/p>':'')+'<\/div>').join(''):'';\n}\nfunction wtResetRange(){wtRange={kind:'all',from:'',to:''};wtRoot.querySelector('#wt-period').value='all';wtQ('date-range').hidden=true;wtSay('range-message','');wtLimit=12;}\nfunction wtDownload(name,text,type){const blob=new Blob([text],{type}),url=URL.createObjectURL(blob),a=document.createElement('a');a.href=url;a.download=name;document.body.append(a);a.click();a.remove();setTimeout(()=>URL.revokeObjectURL(url),30000);}\nfunction wtCsv(){\n const rows=wtView();if(!rows.length)return wtSay('history-message','There are no entries in this view to export.');\n const cell=v=>{let s=v==null?'':String(v);if(typeof v!=='number'&&\/^[\\s]*[=+\\-@]\/.test(s))s=\"'\"+s;return '\"'+s.replace(\/\"\/g,'\"\"')+'\"';};\n const data=[['Cat','Date','Weight kg','Weight lb','BCS low \/9','BCS high \/9','BCS source','Weighing method','Context','Appetite observation','Muscle note','Notes','Imported assessment details','Example']];\n rows.forEach(r=>data.push([wtCat().name,r.date,r.kg,r.kg===null?null:r.kg\/WT_FACTOR,r.low,r.high,wtSource(r),WT_METHODS[r.method],WT_EVENTS[r.event],WT_APPETITE[r.appetite],WT_MUSCLE[r.muscle],r.notes,r.context,!!wtDemo]));\n wtDownload('cat-weight-log-'+wtToday()+'.csv','\\ufeff'+data.map(r=>r.map(cell).join(',')).join('\\r\\n'),'text\/csv;charset=utf-8');wtSay('history-message','CSV downloaded for the selected cat and date range.');\n}\nfunction wtPrint(blank=false){\n const rows=wtView(),cat=wtCat();if(!blank&&!rows.length)return wtSay('history-message','Add an entry or load the example before printing this view.');\n const popup=window.open('','_blank');if(!popup){wtSay('history-message','The print window was blocked. Allow popups for this site, then try again.');return;}\n const d=popup.document;d.open();d.write('<!doctype html>');d.close();d.documentElement.lang='en';d.title=blank?'Blank cat weight log | SnuggleSouls':'Cat weight history | SnuggleSouls';\n const style=d.createElement('style');style.textContent='body{font:12px\/1.55 Arial,sans-serif;color:#18332d;max-width:980px;margin:28px auto;padding:0 18px}h1{font-size:27px;line-height:1.2}h2{font-size:18px;margin-top:24px}p{margin:9px 0}table{border-collapse:collapse;width:100%;font-size:11px;table-layout:fixed}th,td{border:1px solid #cfddd6;padding:9px;text-align:left;vertical-align:top;overflow-wrap:anywhere;white-space:pre-wrap}th{background:#edf5f0}thead{display:table-header-group}tr{break-inside:avoid}svg{display:block;width:100%;max-height:310px}svg text{font:11px Arial;fill:#354b3f}.muted{color:#4e635c;font-size:10px}.summary{border-block:1px solid #cfddd6;padding:10px 0}.example{border:2px solid #123f34;padding:8px}button{padding:10px 18px;margin-bottom:12px}@page{margin:15mm}@media print{button{display:none}body{margin:0;padding:0}a{color:inherit;text-decoration:none}h1,h2,thead{break-after:avoid}}';d.head.append(style);\n const add=(tag,text,cls)=>{const el=d.createElement(tag);if(text!==undefined)el.textContent=text;if(cls)el.className=cls;d.body.append(el);return el;};\n const button=add('button','Print \/ Save as PDF');button.addEventListener('click',()=>popup.print());\n add('p','SNUGGLESOULS \/ CAT CARE RECORD','muted');add('h1',blank?'Cat Weight & Body Condition Log':cat.name+' \u2014 Weight & Body Condition History');\n if(blank){add('p','Cat: _______________________    Weighing method \/ scale: _______________________');add('p','Use one 9-point BCS scale consistently. Leave BCS blank if unsure; note your observations instead.');}\n else{if(wtDemo)add('p','EXAMPLE DATA \u2014 fictional entries, not a target or recommended trend.','example');add('p','View: '+(wtRange.kind==='all'?'All recorded dates':(wtRange.from||'start')+' through '+(wtRange.to||wtToday()))+' \u00b7 '+rows.length+' entries \u00b7 Generated '+wtToday());const weights=rows.filter(r=>r.kg!==null);if(weights.length>1){const first=weights[0],last=weights.at(-1),delta=last.kg-first.kg;add('p','Measured change: '+wtSigned(wtUnit==='kg'?delta:delta\/WT_FACTOR)+' '+wtUnit+' ('+wtSigned(delta\/first.kg*100,2)+'%) over '+wtDays(first.date,last.date)+' calendar days, '+first.date+' to '+last.date+'.','summary');}const svg=wtQ('chart').querySelector('svg').cloneNode(true);svg.querySelectorAll('text').forEach(t=>{t.style.fontSize='11px';});d.body.append(d.importNode(svg,true));add('p','Weight uses its own zoomed axis. BCS: hollow squares = owner estimate; solid squares = veterinary-team score entered by owner; a vertical mark spans an uncertain range. Lines connect measured weights only.','muted');}\n const table=add('table'),head=d.createElement('thead'),hr=d.createElement('tr');['Date','Weight ('+wtUnit+')','BCS \/9 & source','Method & observations'].forEach(t=>{const th=d.createElement('th');th.textContent=t;hr.append(th);});head.append(hr);table.append(head);const body=d.createElement('tbody');\n const output=blank?Array.from({length:12},()=>['\\n','','','']):rows.map(r=>[r.date,wtWeight(r),wtScore(r)+'\\n'+wtSource(r),WT_EVENTS[r.event]+'\\n'+wtEventText(r)]);\n output.forEach(cells=>{const tr=d.createElement('tr');cells.forEach(text=>{const td=d.createElement('td');td.textContent=text;tr.append(td);});body.append(tr);});table.append(body);\n add('h2','Questions \/ plan agreed with the veterinary team');add('p','______________________________________________________________________\\n______________________________________________________________________');\n add('p','Record only the precision your scale supports. Weight change = last \u2212 first; percentage = change \u00f7 first weight \u00d7 100. BCS describes fat covering; muscle condition needs separate assessment. This log does not diagnose a condition, set an ideal weight or recommend a weight-loss rate. Contact your veterinary team about unexplained changes or reduced appetite.','muted');\n add('p','Owner-entered records \u00b7 SnuggleSouls \u00b7 https:\/\/snugglesouls.com\/cat-weight-tracker\/','muted');popup.opener=null;\n}\nfunction wtUniqueName(name){let n=name.slice(0,60),i=1;while(wtCats.some(c=>c.name.toLowerCase()===n.toLowerCase())){const suffix=' (copy '+(++i)+')';n=name.slice(0,60-suffix.length)+suffix;}return n;}\nfunction wtAppendProfiles(cats){\n if(wtCats.length+cats.length>20)throw new Error('There is room for '+(20-wtCats.length)+' more profiles. No profiles were imported.');\n if(!cats.length)throw new Error('No cat profiles were found.');\n if(!wtDiscard())return;\n const staged=[];for(const c of cats){let name=c.name.slice(0,60),i=1;const used=n=>wtCats.concat(staged).some(x=>x.name.toLowerCase()===n.toLowerCase());while(used(name)){const s=' (copy '+(++i)+')';name=c.name.slice(0,60-s.length)+s;}staged.push({id:wtId(),name,records:c.records.map(r=>({...r,id:wtId()}))});}\n wtCats.push(...staged);wtActive=staged[0].id;wtDemo=null;wtReset();wtResetRange();const saved=wtPersist();wtRender();wtSay('profile-message',staged.length+' profile(s) imported as separate copies. '+(saved?'Saved in this browser.':'Download a backup before leaving.'));\n}\nfunction wtLegacy(){\n const raw=localStorage.getItem(WT_LEGACY);if(!raw)throw new Error('No saved BCS profiles were found on this website in this browser. Open the BCS tool in the same browser or use a tracker JSON backup.');\n const data=JSON.parse(raw);if(data.version!==1||!Array.isArray(data.cats)||data.cats.length>10)throw new Error('Saved BCS profiles were not recognized.');\n const cats=data.cats.map(c=>{\n  if(typeof c.name!=='string'||!c.name.trim()||c.name.length>60||!Array.isArray(c.records)||c.records.length>100)throw new Error('A saved BCS profile is invalid. Nothing was copied.');\n  const dates=new Set();return {name:c.name,records:c.records.map(r=>{\n   if(r.example)throw new Error('A saved BCS profile includes example entries. Remove example entries in the BCS tool before copying it.');\n   if(dates.has(r.date))throw new Error('A saved BCS profile has duplicate dates. Nothing was copied.');dates.add(r.date);\n   const context=['Copied from SnuggleSouls BCS tool.',r.lifeStage?'Recorded life stage: '+r.lifeStage:'',r.targetKg!=null?'Entered vet target: '+r.targetKg+' kg':'',r.muscleConcern?'Muscle concern was recorded.':'',r.healthChange?'Appetite \/ weight \/ health change was recorded.':'',...Object.entries(r.observations||{}).map(([k,v])=>'Recorded '+k+': '+String(v))].filter(Boolean).join('\\n');\n   return wtRecord({date:r.date,kg:r.kg,source:r.low==null?'none':r.source,low:r.low,high:r.high,muscle:r.muscleConcern?'concern':'unknown',notes:r.notes||'',context});\n  })};\n });\n wtAppendProfiles(cats);\n}\nwtQ('cat-form').addEventListener('submit',e=>{\n e.preventDefault();if(wtDemo)return;const preserveForm=!wtCat()&&wtDirty;if(!preserveForm&&!wtDiscard())return;\n const input=wtQ('cat-form').elements.namedItem('catName'),name=input.value.trim();\n if(!name)return;if(wtCats.length>=20)return wtSay('profile-message','Twenty profiles are already present. Back up before removing a profile.');\n if(wtCats.some(c=>c.name.toLowerCase()===name.toLowerCase()))return wtSay('profile-message','A profile with this name exists. Select it, or use a distinct name.');\n const cat={id:wtId(),name,records:[]};wtCats.push(cat);wtActive=cat.id;if(!preserveForm)wtReset();wtResetRange();const saved=wtPersist();input.value='';wtRender();wtQ('new-cat').open=false;wtSay('profile-message','Profile created. '+(saved?'Saved in this browser.':'Kept for this visit only.')+(preserveForm?' Your unsaved check-in is ready to save.':''));wtOpenEntry();wtF('weight').focus();\n});\nwtQ('profiles').addEventListener('change',e=>{if(!wtDiscard()){e.target.value=wtActive;return;}wtActive=e.target.value;wtReset();wtResetRange();wtRender();wtSay('profile-message','');wtSay('history-message','');});\nwtForm.addEventListener('input',()=>{wtDirty=true;wtSay('entry-message','Unsaved form changes.');});\nwtForm.addEventListener('change',()=>{\n wtDirty=true;const source=wtF('source').value;wtQ('score-fields').hidden=source==='none';wtQ('upper-field').hidden=source==='vet';if(source==='vet')wtF('high').value='';\n wtSay('entry-message',wtF('appetite').value==='none'?'Not eating is a reason to contact a veterinarian promptly. Saving a log is not a care plan.':'Unsaved form changes.');\n});\nwtForm.addEventListener('submit',e=>{\n e.preventDefault();if(wtDemo)return;\n wtForm.querySelectorAll('[aria-invalid]').forEach(x=>x.removeAttribute('aria-invalid'));\n try{\n  const cat=wtCat();if(!cat){wtQ('new-cat').open=true;wtSay('entry-message','Create or select a cat profile before saving. Your form stays here.');wtQ('cat-form').elements.namedItem('catName').focus();return;}\n  const v=Object.fromEntries(new FormData(wtForm)),kg=v.weight===''?null:Number(v.weight)*(wtUnit==='lb'?WT_FACTOR:1);\n  const row=wtRecord({...v,kg,context:wtContext,id:wtEdit||wtId()});const existing=cat.records.find(r=>r.date===row.date&&r.id!==wtEdit);\n  if(existing&&!window.confirm('This cat already has a check-in on '+row.date+'. Replace that date\u2019s entry with this form?'))return;\n  if(!wtEdit&&!existing&&cat.records.length>=500)return wtSay('entry-message','This cat has 500 entries. Back up the profile before deleting any older entry.');\n  const wasEditing=!!wtEdit;cat.records=cat.records.filter(r=>r.id!==wtEdit&&r.date!==row.date);cat.records.push(row);\n  const saved=wtPersist(),health=row.appetite==='none';wtReset();wtRender();\n  wtSay('entry-message','Check-in '+row.date+' '+(existing?'replaced':wasEditing?'updated':'saved')+'. '+(saved?'Saved in this browser.':'Download a backup before closing.')+(health?' Contact a veterinarian promptly if your cat is not eating.':''));\n  wtSay('history-message',wtView().some(r=>r.id===row.id)?'Saved entry is shown in the timeline and check-in history.':'Saved entry is outside the selected date range. Choose All entries to see it.');\n }catch(error){wtSay('entry-message',error.message);const field=wtF(error.field);if(field){field.setAttribute('aria-invalid','true');field.focus();}else wtQ('entry-message').focus();}\n});\nwtRoot.querySelectorAll('input[name=wt-unit]').forEach(input=>input.addEventListener('change',()=>{\n const next=input.value;if(next===wtUnit)return;\n if(wtF('weight').value!==''&&Number.isFinite(Number(wtF('weight').value)))wtF('weight').value=String(Number((Number(wtF('weight').value)*(next==='kg'?WT_FACTOR:1\/WT_FACTOR)).toPrecision(12)));\n wtUnit=next;wtUpdateBounds();wtRender();\n}));\nwtRoot.querySelector('#wt-period').addEventListener('change',e=>{\n const kind=e.target.value;wtQ('date-range').hidden=kind!=='custom';wtLimit=12;\n if(kind==='custom'){wtSay('range-message','Choose both dates, then apply. The previous view stays visible until applied.');return;}\n wtRange={kind,from:kind==='all'?'':wtOffset(Number(kind)-1),to:kind==='all'?'':wtToday()};wtSay('range-message','');wtRender();\n});\nwtRoot.querySelector('#wt-import').addEventListener('change',async e=>{\n const file=e.target.files[0];if(!file)return;\n try{if(wtDemo)throw new Error('Return to your cats before importing.');if(file.size>80*1024*1024)throw new Error('Choose a JSON backup smaller than 80 MB.');const cats=wtParseCats(JSON.parse(await file.text()));wtAppendProfiles(cats);}\n catch(error){wtSay('profile-message','Import stopped: '+error.message);wtSay('history-message','Import stopped: '+error.message);}\n finally{e.target.value='';}\n});\nwtRoot.addEventListener('click',e=>{\n const button=e.target.closest('[data-action]');if(!button||!wtRoot.contains(button))return;const action=button.dataset.action;\n if(action==='open-entry'){e.preventDefault();if(wtDemo){wtSay('profile-message','Return to your cats to add a check-in.');wtQ('demo-banner').scrollIntoView({block:'start'});return;}wtOpenEntry();if(!wtCat()){wtQ('new-cat').open=true;wtQ('cat-form').elements.namedItem('catName').focus();}else wtF('weight').focus({preventScroll:true});return;}\n if(action==='view-trend'){wtRoot.querySelector('#wt-entry').open=false;wtRoot.querySelector('#wt-timeline-title').scrollIntoView({behavior:'instant',block:'start'});return;}\n if(action==='apply-range'){\n  const from=wtRoot.querySelector('#wt-from').value,to=wtRoot.querySelector('#wt-to').value;\n  if(!wtDate(from)||!wtDate(to)||from>to){wtSay('range-message','Choose two valid dates, oldest first, no later than today.');return;}\n  wtRange={kind:'custom',from,to};wtLimit=12;wtSay('range-message','Date range applied.');wtRender();return;\n }\n if(action==='demo'){\n  if(!wtDiscard())return;wtReset();wtResetRange();\n  const sample=(days,kg,low,extra={})=>wtRecord({date:wtOffset(days),kg,source:low===null?'none':'owner',low,method:'pet',notes:'Fictional demonstration entry.',...extra});\n  wtDemo={id:'example',name:'Luna (example)',records:[sample(56,4.6,5),sample(42,4.55,null),sample(28,4.58,5,{event:'food',notes:'EXAMPLE: food recipe changed; context only, no causal claim.'}),sample(13,4.62,5,{source:'vet',event:'vet',method:'clinic',notes:'EXAMPLE: a different scale was used at the clinic.'}),sample(0,4.59,5,{high:6,notes:'EXAMPLE: uncertain owner estimate, recorded as a range.'})]};\n  wtRoot.querySelector('#wt-entry').open=false;wtRender();wtQ('new-cat').open=false;wtSay('profile-message','Example is read-only and is never saved to your profiles.');wtRoot.querySelector('#wt-timeline-title').scrollIntoView({behavior:'instant',block:'start'});return;\n }\n if(action==='exit-demo'){wtDemo=null;wtReset();wtRender();wtSay('profile-message','Your own profiles are shown. Example data was not saved.');return;}\n if(action==='csv'){wtCsv();return;}\n if(action==='print'||action==='blank'){wtPrint(action==='blank');return;}\n if(action==='more'){wtLimit+=20;wtRender();return;}\n if(action==='unscored'){if(!wtDemo){wtF('source').value='none';wtF('low').value='';wtF('high').value='';wtQ('score-fields').hidden=true;wtDirty=true;wtSay('entry-message','This check will be unscored. Weight and notes can still be saved.');wtF('source').focus();}return;}\n if(wtDemo){wtSay('history-message','Return to your cats before changing or backing up profiles. The example is read-only.');return;}\n if(action==='backup'){if(!wtCats.length)return wtSay('history-message','Create a profile before downloading a backup.');wtDownload('snugglesouls-cat-weight-backup-'+wtToday()+'.json',JSON.stringify(wtPackage(),null,2),'application\/json');wtSay('history-message','Backup downloaded: all saved profiles and dates. Unsaved form changes are not included.');return;}\n if(action==='legacy'){try{wtLegacy();}catch(error){wtSay('history-message','Copy stopped: '+error.message);}return;}\n if(action==='cancel-edit'){if(wtDiscard()){wtReset();wtProfiles();}return;}\n if(action==='edit'){\n  if(!wtDiscard())return;const r=wtCat()?.records.find(x=>x.id===button.dataset.id);if(!r)return;\n  wtReset();wtEdit=r.id;wtContext=r.context;\n  for(const [k,v] of Object.entries({date:r.date,weight:r.kg===null?'':Number((wtUnit==='kg'?r.kg:r.kg\/WT_FACTOR).toPrecision(12)),source:r.source,low:r.low??'',high:r.high===r.low?'':r.high,method:r.method,event:r.event,appetite:r.appetite,muscle:r.muscle,notes:r.notes})){const f=wtF(k);if(f)f.value=v;}\n  wtQ('score-fields').hidden=r.source==='none';wtQ('upper-field').hidden=r.source==='vet';wtQ('imported-context').hidden=!r.context;\n  wtRoot.querySelector('#wt-entry-title').textContent='Edit check-in';wtQ('entry-caption').textContent=wtCat().name+' \u00b7 '+r.date;wtForm.querySelector('[type=submit]').textContent='Update check-in';wtRoot.querySelector('[data-action=\"cancel-edit\"]').hidden=false;\n  wtOpenEntry();wtF('date').focus({preventScroll:true});return;\n }\n if(action==='delete'){\n  const cat=wtCat(),r=cat?.records.find(x=>x.id===button.dataset.id);if(!r||!wtDiscard())return;\n  if(!window.confirm('Delete '+cat.name+'\u2019s check-in on '+r.date+'? You can undo this deletion during this visit.'))return;\n  wtUndo=JSON.stringify(wtCats);cat.records=cat.records.filter(x=>x.id!==r.id);wtReset();const saved=wtPersist();wtRender();wtRoot.querySelector('[data-action=\"undo\"]').hidden=false;wtSay('history-message','Entry deleted. '+(saved?'Saved in this browser.':'Change is for this visit only.'));return;\n }\n if(action==='delete-cat'){\n  const cat=wtCat();if(!cat)return wtSay('history-message','Select a profile first.');if(!wtDiscard())return;\n  if(!window.confirm('Delete the profile '+cat.name+' and all '+cat.records.length+' entries from this browser? Download a backup first if you need a permanent copy.'))return;\n  wtUndo=JSON.stringify(wtCats);wtCats=wtCats.filter(c=>c.id!==cat.id);wtActive=wtCats[0]?.id||'';wtReset();wtResetRange();wtPersist();wtRender();wtRoot.querySelector('[data-action=\"undo\"]').hidden=false;wtSay('history-message','Profile deleted. Undo is available during this visit.');return;\n }\n if(action==='undo'&&wtUndo){\n  if(!wtDiscard())return;\n  if(!window.confirm('Restore the snapshot from immediately before the last deletion? Changes made after that deletion will be replaced. Download a backup first if needed.'))return;\n  wtCats=JSON.parse(wtUndo);wtUndo=null;if(!wtCats.some(c=>c.id===wtActive))wtActive=wtCats[0]?.id||'';wtReset();wtPersist();wtRender();button.hidden=true;wtSay('history-message','The snapshot from before the last deletion was restored.');return;\n }\n});\ntry{const raw=localStorage.getItem(WT_KEY);if(raw)wtCats=wtParseCats(JSON.parse(raw));}\ncatch(e){wtStorageUnreadable=true;wtStorageMessage('Existing tracker storage could not be read and has not been changed. You can use a temporary log and download it before leaving.');}\nwtActive=wtCats[0]?.id||'';wtRoot.querySelectorAll('[data-enable]').forEach(e=>e.disabled=false);wtReset();wtRender();\nlet wtLastWidth=0;if(globalThis.ResizeObserver)new ResizeObserver(entries=>{const width=Math.round(entries[0].contentRect.width);if(width!==wtLastWidth){wtLastWidth=width;wtRenderChart();}}).observe(wtQ('chart'));\nwindow.addEventListener('beforeunload',e=>{if(wtDirty){e.preventDefault();e.returnValue='';}});\nwindow.addEventListener('storage',e=>{if(e.key===WT_KEY||e.key===null){wtStorageUnreadable=true;wtStorageMessage('Tracker storage changed in another tab. This tab will keep further changes for this visit only, to avoid overwriting the other tab. Back up any new entries here, then reload to use the latest saved records.');}});\n\nif(location.hash==='#wt-entry')wtOpenEntry();\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>Cat Weight Tracker &amp; Body Condition Log Record weight, follow changes, and keep body condition notes in one place. Start a weight logExplore an example Your trackerHow to weigh a catUnderstanding BCSQuestions &amp; answers Your cat\u2019s weight journal + Add a check-in Free to use. No account needed. Save records in this browser and download [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":8104,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-8251","page","type-page","status-publish","has-post-thumbnail","hentry"],"_links":{"self":[{"href":"https:\/\/snugglesouls.com\/de\/wp-json\/wp\/v2\/pages\/8251","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=8251"}],"version-history":[{"count":5,"href":"https:\/\/snugglesouls.com\/de\/wp-json\/wp\/v2\/pages\/8251\/revisions"}],"predecessor-version":[{"id":8333,"href":"https:\/\/snugglesouls.com\/de\/wp-json\/wp\/v2\/pages\/8251\/revisions\/8333"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/snugglesouls.com\/de\/wp-json\/wp\/v2\/media\/8104"}],"wp:attachment":[{"href":"https:\/\/snugglesouls.com\/de\/wp-json\/wp\/v2\/media?parent=8251"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}