mirror of
https://github.com/Matysh/houseplan-card
synced 2026-09-30 19:58:50 +00:00
129 lines
9.3 KiB
Markdown
129 lines
9.3 KiB
Markdown
# #505 — author evidence and visual comparison
|
||
|
||
Issue: [#505](https://github.com/Matysh/houseplan-card/issues/505).
|
||
Spec: [505-summary-panel-design-parity.md](../../specs/505-summary-panel-design-parity.md).
|
||
This is implementation evidence, **not** the independent S7 verdict.
|
||
|
||
## Reproduce the paired visual check
|
||
|
||
After `npm ci` and `npm run bundle:sync`:
|
||
|
||
```sh
|
||
node demo/capture_summary_panel_505.mjs --probe-only
|
||
node demo/capture_summary_panel_505.mjs --output artifacts/summary-panel-505
|
||
```
|
||
|
||
The [fixture instructions](../../../demo/helpers/README-ha-dialog-505.md) explain
|
||
the pinned official HA wheel, isolated loopback server, cache integrity and
|
||
optional offline wheel. No production HA instance is accessed. The genuine
|
||
`hp-dialog → ha-dialog → wa-dialog → dialog` chain is exercised; only the HA
|
||
app's private loader is exposed, not a replacement dialog implementation.
|
||
|
||
Author run on Windows/Chromium, product commit `05778a47` (pre-rebase
|
||
`a038149c`, recorded in the original capture):
|
||
source fingerprint `23ed457d01a2622aae7bb6937116f20f0044b8216b723388ed3dcf85dacd4a1e`.
|
||
Rebase onto dev `2e387ac1` preserved identical frontend source and bundle bytes;
|
||
both unrelated #495 and #505 changelog entries were retained. `gate:small` was
|
||
rerun successfully after the rebase.
|
||
The full capture completed all five paired panel contexts and native/real-HA
|
||
settings in desktop, 320/390px, light/dark and enlarged-text cases. Every settings
|
||
surface/editor/footer had no horizontal overflow and a visible footer; no page
|
||
errors, external requests or WebSockets occurred. The separate authentic probe
|
||
measured small=320, medium=580, inherited medium=920, mobile=390 fullscreen.
|
||
The product's **first opening** was 920px in both native and genuine HA.
|
||
|
||
Long German source fields were additionally re-captured using `--only` for
|
||
the `edge-*-text-200-long-de*` scenarios after replacing an incorrect assumption
|
||
about scroll ownership in the capture. Real HA scrolls its shadow `.body`,
|
||
native scrolls `.summary-editor`. The report records both scroll owners and
|
||
the actual visible band between header and footer; the source name and entity
|
||
ID were visually inspected in the corrected start/end frames. Product code
|
||
was not changed for this capture correction.
|
||
|
||
These are diagnostic frames, not canonical golden/docs baselines. The main
|
||
matrix and corrected source frames were personally inspected, including
|
||
desktop light/dark, bottom portrait, kiosk, mobile View, native/HA settings,
|
||
and enlarged German text. The portable command produces the same comparisons
|
||
for the independent reviewer. A completed capture alone is not visual approval.
|
||
|
||
## Comparison result and bounded adaptations
|
||
|
||
| Surface | Result |
|
||
|---|---|
|
||
| Header/kiosk control | Designer outline gear on the left, sidebar on the right; only the right half is active. Normal control is last in View actions, kiosk control floats above the panel. |
|
||
| Panel | Separate header, muted scroller, white/theme block cards, header dividers and left-label/right-bold-value rows. Compact content height, 12px radius and stage insets; right/bottom anchoring preserved. |
|
||
| Settings | General/Blocks cards, block count, grip/arrows/name/eye header, scope row, label/source/remove value rows, dashed add actions and separate destructive block footer match the composition. |
|
||
| Responsive form | Wide 920px shell instead of the reference's 780px accommodates readable text and 44px controls. Narrow fields stack. HA retains its own fullscreen rule and close-button placement; native keeps its normal modal close position. |
|
||
| Themes and text | HA theme colors replace hard-coded cyan/white. Text is larger than the miniature reference and follows root font size; HA's 14px root yields a 19.25px title, native 16px root yields 22px. At root32px the title is 44px and wraps without clipping. |
|
||
| Data and actions | Real HA-formatted values, stable source picker, permissions and shared/local ownership retained. Save stays visible but disabled when unchanged, unlike the demo's omitted Save. No size controls in this dialog; stored scales preserved. |
|
||
|
||
The 800×500 effective-viewport scenario is a layout proxy for 200% zoom, **not
|
||
an actual browser-zoom claim**. Separate root32px scenarios exercise enlarged
|
||
text. Different fake HA chrome, background plan and empty non-summary glyph
|
||
stubs are outside comparison scope. No pixel-identical rendering is claimed.
|
||
|
||
## Executed gates
|
||
|
||
- `npm run gate:small` — PASS: frontend units, typecheck/build, no-new-any,
|
||
bundle parity and budget. The initial View graph is 298558B gzip, only 1B
|
||
above the pre-task build; all added summary shell CSS is lazy. No budget or
|
||
baseline was increased.
|
||
- `node demo/smoke_summary_panel.mjs` — PASS, retaining live values, lost-ACK,
|
||
source identity, 10k-entity/200-row/multi-card scenarios.
|
||
- `node demo/smoke_summary_panel_polish.mjs` — PASS, actual frame sampling,
|
||
lifecycle boundaries, native geometry and persisted-setting combinations.
|
||
- `node demo/smoke_kiosk.mjs`, `node demo/smoke_houseplan_panel.mjs`,
|
||
`node demo/smoke_dialog_footer_width.mjs`, `node demo/smoke_nav_persist.mjs`,
|
||
`node demo/smoke_lazy_editor_chunk.mjs`, `node demo/smoke_warm_dialogs.mjs`
|
||
— PASS for neighbouring View/navigation/dialog contracts.
|
||
- `node scripts/check-docs.mjs --screenshots=warn` — PASS with the expected
|
||
stale canonical screenshot warning. Strict capture/acceptance belongs to
|
||
the beta candidate; no Windows baseline acceptance was performed.
|
||
- `git diff --check`, `node scripts/check-inputs.mjs --coverage`,
|
||
`node scripts/mutation-gate.mjs --check` — PASS.
|
||
|
||
The broader smoke-select list includes unrelated symbols reached through the
|
||
large card renderer. Geometry, drawing, light, PDF, backend and public models
|
||
are unchanged; their full release suites and performance/golden captures were
|
||
not rerun for this task. This is not a release-quality assertion for a beta.
|
||
|
||
## AC and failure witnesses
|
||
|
||
All registered witnesses below were run with
|
||
`node scripts/mutation-gate.mjs --id=<id>` on the implementation commit:
|
||
each clean guard passed, each mutated guard failed, and the runner reported
|
||
`поймано 1 из 1` with exit0. No stale-bundle bypass was used.
|
||
|
||
| AC | Evidence | What detects a regression |
|
||
|---|---|---|
|
||
| AC1–2 | Focused smoke geometry/content + paired visual inspection above | Direct actual DOM/bounds/glyph/value comparisons; these are presentation AC, not guards. |
|
||
| AC3 | Focused smoke samples opacity, 18px offset, 190ms duration, one retained inert node, reversal and removal | `summary-hide-unmounts-before-animation` is caught. |
|
||
| AC4 | `test/summary-panel-presentation.test.mjs` plus focused browser lifecycle matrix | `summary-animation-stale-completion-unguarded`, `summary-animation-reset-keeps-presentation`, `summary-animation-ignores-reduced-motion` are caught. Actual browser checks include backgrounding, resize, eligibility, editors and identity changes. |
|
||
| AC5 | Native width/actual-control bounds smoke plus authentic HA measured and inspected frames | `summary-dialog-loses-wide-shell` is caught; it removes wide from the real form rather than changing a test fixture. |
|
||
| AC6 | Existing/focused summary smokes and paired settings frames | Actual CRUD/reorder/visibility/source/confirmation results and direct layout comparison. |
|
||
| AC7 | Summary runtime units and focused persisted-storage comparisons, admin and local-only | Read-through confirms existing scale load/save authority is untouched; the existing `summary-local-scale-authority-disabled` witness remains applicable (not rerun here). |
|
||
| AC8 | All local/mobile pairs through Save/Cancel/X/Escape/reopen/reload; unchanged and busy form | `summary-mobile-ignores-local-off` is caught by real disabled/focus/reopen/reload assertions; prior checkbox value remains saved. |
|
||
| AC9 | Existing summary runtime units + source picker/live/lost-ACK smoke | Existing #493 guard mechanisms read as unchanged; their registered witnesses remain applicable. This task does not claim a fresh negative run of every unchanged backend/permission guard. |
|
||
| AC10 | Four locales, narrow geometry, actual targets, keyboard, camera identity; theme/large-text frames | Actual bounds/focus/value comparisons and frame inspection. |
|
||
| AC11 | Gates/docs above; code scope inspection | No new eager implementation except header call order; stored schema and backend untouched. |
|
||
|
||
## Code-review r1 follow-up
|
||
|
||
The independent review accepted the implementation and recorded one Low L1:
|
||
`summary.block_visible` had no remaining consumers. The follow-up removes only
|
||
that unused key from all four dictionaries and rebuilds the bundle. No render,
|
||
style, event, model or visible string is changed. The paired visual evidence
|
||
above still describes the accepted implementation; it is not claimed as a new
|
||
capture of the cleanup commit.
|
||
|
||
- `rg -n 'summary\.block_visible' src demo test scripts` — no matches.
|
||
- `npm run gate:small` after rebuilding, synchronizing and staging the complete
|
||
generated trees — PASS. The preliminary attempts caught unsynchronized bundle
|
||
manifests and untracked generated assets; both were corrected without changing
|
||
any test or gate.
|
||
- `node demo/smoke_summary_panel_polish.mjs` on the fresh cleanup bundle — PASS.
|
||
|
||
Rollback is a revert and normal bundle rebuild. Nothing needs data migration.
|
||
Independent review and pipeline merge remain required before S8; publication
|
||
and issue closure belong to a later release request.
|