# Changelog All notable changes to this project are documented here. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [1.3.14] - 2026-10-24 ### Fixed - Windows reported a permanent `0%` for memory. `platform/win32.js` read `TotalVisibleMemorySize` and `AvailableKB` from `Win32_PerfFormattedData_PerfOS_Memory`, where neither exists: the total lives on `Win32_OperatingSystem` (also in KB), and the available counter is `AvailableKBytes` (`AvailableBytes` / `AvailableMBytes` are the other spellings). Both reads returned `$null`, `[double]` turned that into 0, and `total = 0` pinned the percentage to 0 — CPU, disk, network and temperature were unaffected, which is what made it look like an idle machine. Reported on Windows 10 22H2 (10.0.19045) with an i5-12600KF; the two corrected reads come from objects the loop already queried, so there is no extra WMI call. - A sample that cannot report memory now yields `null` fields, rendered as `—`, instead of a confident `0%` — a future sampler break shows up as "unknown" rather than as a healthy idle host. - The raw-sample-to-snapshot mapping moved into an exported `sampleToSnapshot()`, so the Windows mapping can be checked without Windows. ## [1.3.13] - 2026-10-23 ### Fixed - The strip keeps its fifth reading at a 1280px viewport again. 1.3.12 started measuring against the row's content box, which is correct, but it kept the 12px safety margin that had been raised back when the budget still included the row's 16px of horizontal padding — so the margin was really -4px and the host flipped its compact mode; with the corrected basis, 12px left 368px against a 370px five-cell snap and cost one reading. The margin is now a genuine 8px: measured 370px of budget at a 1280px viewport, five readings, and still no painted overflow frame. ## [1.3.12] - 2026-10-23 ### Removed - The 12px fade at the strip's right edge. It existed to hide a partially clipped reading, but the width cap snaps to whole cells, so the cut never lands inside a value — the gradient only faded the last visible reading. Measured at ten viewport widths from 1400px down to 480px: no partially visible cell at any of them, so plain clipping shows every reading intact. ## [1.3.11] - 2026-10-23 Verified against the live Web UI in headless Chromium, sweeping the viewport 1300 -> 470 px in 10 px steps: the 1.3.10 build paints 4 over-wide frames (the composer row wraps to a second line and snaps back) and ends the sweep permanently wrapped; this build paints none and keeps a single line. ### Changed - Chinese display name is now 「负载条」 (was 「系统体征」): the settings nav entry and the plugin-market title. The package name stays `dsh-system-vitals`, so installed copies and install commands are unaffected. ### Fixed - The left-hand controls no longer jump and snap back while the window width changes. 1.3.10 measured the cap in a layout effect, which only covers React's own commits: the resize path went through `setState` from a `ResizeObserver`, and React commits a state update in a task that runs *after* the current frame is painted. Every resize step therefore painted one frame with the strip still at its previous, wider cap; that overflow squashed the row's shrinkable native controls (`+`, the permission/mode selectors, the model seat) for exactly that frame, and the next frame restored them — the flicker. The cap is now written straight to the element's `max-width` inside the observer callback, so the correction is part of the same rendering update and no painted frame can show the strip wider than the row allows. The observer also watches the row's children now, because the host flips the model seat's compact mode by changing *their* widths without moving the row's width. - The cap is measured against the row's content box, the same box the host compares its own "does everything fit" sum against. `clientWidth` carries the row's 16px horizontal padding, so the strip used to plan with 4px less margin than intended and could make the host wrap or compact right at the boundary. ## [1.3.10] - 2026-10-23 ### Fixed - No more transient jump of the composer's left controls while resizing. Three causes are addressed: the strip started at its natural width and only shrank after a post-paint effect ran (the overflow in that frame pushed the `+` and permission controls onto their own line); the cap is now measured in a layout effect and the strip starts at zero width, so no paint ever overflows. A 4px hysteresis stops sub-pixel churn, and the safety margin grew from 4px to 12px so the host's compact-mode toggle no longer flips on rounding. ## [1.3.9] - 2026-10-23 ### Fixed - The whole-cell snap never ran: it read `element.children[0]` as the first reading, but the root's first child is the injected `