From 394c7a5038825b041ae580e06b3c27e0ca61fc1f Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 14 Sep 2026 01:13:05 +0900 Subject: [PATCH 1/5] docs: localize grid residual to raster composition --- docs/grid-raster-composition.md | 173 ++ docs/grid-raster-evidence.json | 2820 +++++++++++++++++++++++++++++++ 2 files changed, 2993 insertions(+) create mode 100644 docs/grid-raster-composition.md create mode 100644 docs/grid-raster-evidence.json diff --git a/docs/grid-raster-composition.md b/docs/grid-raster-composition.md new file mode 100644 index 0000000..89767c3 --- /dev/null +++ b/docs/grid-raster-composition.md @@ -0,0 +1,173 @@ +# Grid: correct cell placement, lossy raster composition + +Investigated from clean `937313e39448db7f7c05dbb0ab206432261b2203` in +`W24-C-grid`. This is a quantified negative: no production correction is +committed and no threshold is lowered. The discrepancy is localised to three +exported photographs, not the CSS grid track projection. Two distinct raster +effects remain: shrinking integer PNG canvases into fractional layout boxes, +and the sampling difference between individual-node and whole-frame exports. + +## Own baseline and localisation before Rust + +The own-target baseline executable was preserved before test builds as +`harness/render/out/w24-grid-baseline.exe`, SHA-256 +`27ca7e30f7fea3f1e76fe6e5049e46d1b5461d2b461a7bf8d7e0fef864c831c7`. +It reports build `937313e39448`, without a dirty suffix. The isolated harness +uses unchanged tracked scripts, copied call-bank inputs, its own generated +files, and the existing unchanged visual comparator from main. No acquisition +identity check was bypassed. Both screens were reacquired and rendered twice. + +| Screen | Baseline run 1 | Baseline run 2 | Rendered size | +| --- | ---: | ---: | --- | +| grid-429-1966 | 41,234 / 1,391,166 = 2.9639884816% | identical | 1281x1086 | +| keyframes-458-2021 | 110 / 4,096 = 2.6855468750% | identical | 64x64 | + +Both use theme SHA-256 +`a1a8437993a02c99489dfdc71ca7e2f5d6447f4956600fd939272816bc0f3f63`. +The before numbers are measured, not taken from thresholds. Full metrics, +input hashes, node fields and repeated probes are in +[grid-raster-evidence.json](grid-raster-evidence.json). + +`bands.mjs`, `drift.mjs`, `crop.mjs`, `boxes.mjs` and `elements.mjs` were used. +The first 300 rows contain zero differing pixels; y=400–500 contains 9,290, +and y=1000–1086 contains 7,699. Most bands prefer zero vertical offset; the +last band prefers -1, consistent with internal rescaling rather than page +height accumulation. Full-resolution crops show photographic detail changes. + +Every differing pixel belongs to one of the last three asset boxes. The +following partition assigns each pixel once, including fractional edge pixels. +No differing pixel remains in gaps or outside the photographs. + +| Node | Source local x,y | Source width,height | PNG width,height | Baseline changed pixels | +| --- | --- | --- | --- | ---: | +| 429:1967 | 0,0 | 847,348 | 847,348 | 0 | +| 429:1968 | 867,0 | 413,348 | 413,348 | 0 | +| 429:1969 | 0,368 | 413,717 | 413,717 | 0 | +| 429:1970 | 433.3333129882813,368 | 847,349 | 847,349 | 24,299 | +| 429:1971 | 433.3333129882813,737 | 413.3333435058594,348.3333435058594 | 414,349 | 10,488 | +| 429:1972 | 867,737 | 413.3333435058594,348.3333435058594 | 414,349 | 6,447 | + +## What is ruled out + +Only after measurement and localisation was `grid_template` inspected. Its +three HUG tracks emit `repeat(3, fit-content(100%))` on both axes. Chromium +resolves columns to 413.328125, 413.671875 and 413.5px and rows to 348,349, +348.328125px. Image origins are (0,0), (867,0), (0,368), (433.328125,368), +(433.328125,737), (867,737). These match the collected origins to CSS layout +precision. The root's screenshot size is the integer canvas; its source box +is actually 1280.3333740234375x1085.3333740234375. + +An isolated browser probe removes grid placement from the equation by +absolutely positioning every image at its **collected** x,y. It reproduces all +41,234 changed pixels and every per-image count exactly. This probe collapses +the empty grid's intrinsic height, so it is diagnostic only, never a candidate +layout. Restoring full source precision for image dimensions also reproduces +all counts. Rounding origins makes the result worse, at 47,524 pixels. There +is no evidence to replace HUG tracks or emit fitted grid dimensions. + +All seven prior reports were read. This snapshot has seven nodes: one grid +frame and six leaf assets. There is no live text, no painted stroke array, +no mask, no nested live child composition, no CROP fill, no effects and no +animation. The six image fills have FILL mode, identity image transforms, +opacity 1 and zero image filters. Therefore the previously fixed text, weight, +whitespace, overflow, mask, crop, lone-flex-child and outside-edge mechanisms +do not explain these pixels. The intentional Korean allowance is **0pp here**: +there are no generated text nodes. No Korean policy or test was changed. + +## Raster probes and what resisted correction + +Probes start from the unchanged generated page. PNGs are flattened onto the +same RGB(30,30,30) canvas and compared at channel tolerance 24. Every final +paired probe also captures keyframes, which remains at 110 pixels throughout; +both paired suites repeat identically. Early exploratory grid-only runs are +not substituted for the paired confirmation. + +| Browser intervention | Grid pixels | 429:1970 / 1971 / 1972 | Keyframes pixels | +| --- | ---: | --- | ---: | +| Baseline | 41,234 | 24,299 / 10,488 / 6,447 | 110 | +| Full-precision source sizes | 41,234 | 24,299 / 10,488 / 6,447 | 110 | +| Collected source positions | 41,234 | 24,299 / 10,488 / 6,447 | 110 | +| Rounded source positions | 47,524 | 24,299 / 16,778 / 6,447 | 110 | +| object-fit:none; object-position:left top | 29,333 | 24,299 / 5,028 / 6 | 110 | +| Natural paint plus source positions | 29,333 | 24,299 / 5,028 / 6 | 110 | +| translateZ(0) | 41,234 | 24,299 / 10,488 / 6,447 | 110 | +| Natural paint plus translateZ(0) | 29,333 | 24,299 / 5,028 / 6 | 110 | +| SVG image primitive at source boxes | 39,806 | 24,299 / 12,236 / 3,271 | 110 | +| SVG image at natural paint dimensions | 29,333 | 24,299 / 5,028 / 6 | 110 | + +The natural-paint probe removes 11,901 pixels, **0.855469% of frame area**, +without changing any layout box. This is a browser-only delta, not a shipped +generator improvement. The bottom-right image independently confirms the +mechanism: its unscaled exported PNG at its integer source origin differs +from the whole-frame reference in only four pixels (zero in the two-pixel +inset interior), whereas shrinking it into the fractional box produces 6,447. + +Natural painting does not solve the largest image. Node 429:1970 has an +integer 847x349 source/export size; its standalone PNG itself already differs +from the reference region by 24,299 pixels. There is no double size conversion +to remove there. Its fractional source x is the distinguishing field. A +numeric bilinear sampling probe on the two-pixel inset interior reduces +23,693 differences to 12,230 at +1/3px horizontal phase and zero vertical +phase, but does not recover the original whole-frame samples. The analogous +429:1971 interior falls from 4,366 to 1,552. These are bounded diagnostic +sampling tests, not permission to fit a translation or blur to the capture. +No subpixel offset, width branch, node special case or filter is introduced. + +`assets.js` verifies the requested image fill, then calls `node.exportAsync` +with a SCALE constraint; it does not supply the raw photograph. The export +API supports density scales 1–4. `CodegenOptions` and `push_object_fit` do not +receive the selected export scale or the actual PNG canvas dimensions. +Blindly emitting `objectFit="none"` for fractional nodes would paint a 2x +export at twice its intended size. Inferring a 1x export from a fractional +layout width is invalid. Existing `export_offset` compares geometric render +bounds with layout bounds; in this capture they coincide, so it cannot supply +the missing raster canvas/density semantics either. + +A separate request asked for scale-2 exports of the three affected assets, +writing new filenames rather than replacing acquired inputs. It returned no +response or files after more than five minutes and was stopped; its own +Python/server processes were terminated. Thus no scale-2 measurement is +claimed. The scale concern above follows the supported API and CSS intrinsic +sizing, not a fabricated scale-2 screenshot result. + +The next correction needs a density-aware mapping from exported pixel canvas +to logical paint bounds, with scale-1 and scale-2 evidence and truthful source +mapping. Fractional-origin sampling additionally needs validation against the +whole-frame reference; recomposing already rasterised samples cannot be assumed +to recover it. A raw-image or vector export strategy would need its own crop, +clipping and density proof. This is the specific representation boundary left +open, rather than an uninvestigated CSS-grid lead. + +## Delivery and verification + +No Rust, plugin golden, manifest checksum, plugin build, threshold, provenance, +fidelity or source-map output is changed. There is no production candidate and +therefore no synthetic failing-test claim: the work remains a measured negative, +as permitted by the task. All 268 plugin goldens retain their existing bytes. +No off-limits file or tracked harness script is edited. Shared layout/style/text +and provenance files have **no overlap** for the coordinator to merge. + +The final fresh acquire/render again produced 41,234 grid pixels and 110 +keyframes pixels, with both actual PNGs byte-identical to the first baseline. +It used the preserved baseline executable; no test rebuild was silently +substituted for the acquired binary. + +| Required own-target gate | Result | +| --- | --- | +| `cargo fmt --all -- --check` | Pass | +| `cargo clippy --locked --workspace --all-targets --all-features -j 2 -- -D warnings` | Pass, zero warnings | +| `cargo test --workspace -j 2 --no-fail-fast` | 1,112 passed / 0 failed / 2 ignored | +| `cargo insta test --workspace --all-features --check` | 1,112 passed / 0 failed / 2 ignored; no snapshots to review | +| `cargo test --locked -p devup-mcp --test stdio_smoke -j 2` | 2 passed / 0 failed | + +The unchanged corpus consistency test and Korean preservation test pass. +Ordinary MSVC linking emits the pre-existing library-creation messages; +Clippy itself has zero warnings. Gate logs are +`harness/render/out/w24-{fmt,clippy,workspace,insta,smoke}.log`. +All Cargo invocations use two jobs, `CARGO_PROFILE_DEV_DEBUG=0`, +`CARGO_PROFILE_TEST_DEBUG=0`, `CARGO_INCREMENTAL=0`; `CARGO_TARGET_DIR` is never +set. Raw logs and probe scripts are under ignored `harness/render/out/w24-*` +and `harness/render/out/grid-*`. Only this report and its evidence JSON are +included in the local commit; nothing is pushed. Delivery cleanup runs +`cargo clean` after the commit and checks that no task-started generator or +preview server remains before sending the worker outcome. diff --git a/docs/grid-raster-evidence.json b/docs/grid-raster-evidence.json new file mode 100644 index 0000000..a7e3b1f --- /dev/null +++ b/docs/grid-raster-evidence.json @@ -0,0 +1,2820 @@ +{ + "baseCommit": "937313e39448db7f7c05dbb0ab206432261b2203", + "outcome": "Quantified negative; no production change or threshold reduction", + "baselineRuns": [ + [ + { + "name": "grid-429-1966", + "frame": "429:1966", + "viewport": { + "width": 1281, + "height": 1086 + }, + "reference": "out/grid-429-1966.reference.png", + "actual": "out/grid-429-1966.actual.png", + "acquisition": { + "binarySha256": "27ca7e30f7fea3f1e76fe6e5049e46d1b5461d2b461a7bf8d7e0fef864c831c7", + "server": { + "version": "0.4.6", + "buildId": "937313e39448", + "commit": "937313e39448", + "displayVersion": "0.4.6+937313e39448", + "identityGuidance": "Identify deployments by commit/buildId, not version alone. If the expected commit/buildId differs, reconnect or restart the client MCP server connection after updating the binary.", + "updateAvailable": { + "current": "0.4.6", + "state": "unknown", + "note": "The newest release is not known: the check has not run yet, or it could not reach the network. This is an absent answer, not a failure, and it never delays a call." + } + }, + "responsePath": "out/grid-429-1966-429-1966.response.json", + "files": { + "src/screens/grid-429-1966.tsx": "6b16b8f79f4ecf590a24a1c13af67b488afc08a2d513d156e000c20728c1b0d2", + "themes/grid-429-1966.json": "a1a8437993a02c99489dfdc71ca7e2f5d6447f4956600fd939272816bc0f3f63", + "out/grid-429-1966.reference.png": "251925cfa907bcb24ff2077cbf81a778a0be9a9df62a9532359bea231f468e10", + "out/grid-429-1966-429-1966.snapshot.json": "9de5a06b83300efc89c2b02b21f0b7af0f71326accac1ad9dfe62a88c3bd6c02", + "public/images/Frame-506-429-1967-986461bdbd3b.png": "8722fc62d4e2e2395697bad982d1d28d159d10b15b0d38b09535e78232ea4ed6", + "public/images/Frame-508-429-1968-c886d36997c5.png": "7f8167a9cd5504e7a5e3a386993e6b6eb1dbd21753a86b940ecd4084c65983b7", + "public/images/Frame-509-429-1969-a6034b24119a.png": "e13b27fae8519c989ccda979e02377c63ed659b6105ce2263f227bae789bb1b8", + "public/images/Frame-507-429-1970-021ef10975df.png": "1fd831e6b6aab7c067a2d57fb06d42738fffe7bdf69c3ffbe9cd89fc1d9a9746", + "public/images/Frame-510-429-1971-40e88a5fbe9d.png": "83b2e86d2e4017e1a0996b56d76162ed2de8d6002918fb30aa1b4b083a33cc61", + "public/images/Frame-511-429-1972-f549097083e6.png": "d005a60f6b3f5d904c8f41f6fca683179e549e8416cee9fec6819e25e6d9d3d7" + } + }, + "themeHash": "a1a8437993a02c99489dfdc71ca7e2f5d6447f4956600fd939272816bc0f3f63", + "rendered": { + "width": 1281, + "height": 1086 + }, + "flattened": { + "canvas": [ + 30, + 30, + 30 + ], + "alpha": 0 + }, + "environmentStatus": "valid", + "compare": { + "exit": 1, + "stdout": "{\"status\":\"mismatch\",\"referenceDimensions\":[1281,1086],\"actualDimensions\":[1281,1086],\"changedPixels\":41234,\"totalPixels\":1391166,\"changedRatio\":0.029639884816046395,\"maxChangedRatio\":0.005,\"channelTolerance\":24,\"maxChannelDelta\":176,\"diffPath\":\"C:\\\\Users\\\\owjs3\\\\orca\\\\workspaces\\\\devup-mcp\\\\W24-C-grid\\\\harness\\\\render\\\\out\\\\grid-429-1966.diff.png\"}", + "stderr": "" + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 1281, + 1086 + ], + "actualDimensions": [ + 1281, + 1086 + ], + "changedPixels": 41234, + "totalPixels": 1391166, + "changedRatio": 0.029639884816046395, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 176, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W24-C-grid\\harness\\render\\out\\grid-429-1966.diff.png" + } + }, + { + "name": "keyframes-458-2021", + "frame": "458:2021", + "viewport": { + "width": 64, + "height": 64 + }, + "reference": "out/keyframes-458-2021.reference.png", + "actual": "out/keyframes-458-2021.actual.png", + "acquisition": { + "binarySha256": "27ca7e30f7fea3f1e76fe6e5049e46d1b5461d2b461a7bf8d7e0fef864c831c7", + "server": { + "version": "0.4.6", + "buildId": "937313e39448", + "commit": "937313e39448", + "displayVersion": "0.4.6+937313e39448", + "identityGuidance": "Identify deployments by commit/buildId, not version alone. If the expected commit/buildId differs, reconnect or restart the client MCP server connection after updating the binary.", + "updateAvailable": { + "current": "0.4.6", + "state": "unknown", + "note": "The newest release is not known: the check has not run yet, or it could not reach the network. This is an absent answer, not a failure, and it never delays a call." + } + }, + "responsePath": "out/keyframes-458-2021-458-2021.response.json", + "files": { + "src/screens/keyframes-458-2021.tsx": "f9e4d334a007caf23cc45575ea1a93a33b3b90abb5b8bc416952745072c6a935", + "themes/keyframes-458-2021.json": "a1a8437993a02c99489dfdc71ca7e2f5d6447f4956600fd939272816bc0f3f63", + "out/keyframes-458-2021.reference.png": "94ff08ecd5dac40feeb9ba154e40f0f527dbcaa31c02f5cbf0c03dae25ede191", + "out/keyframes-458-2021-458-2021.snapshot.json": "8ae3430b3818eabbdaae857264cdc505a5fbed16831041e2e747d4a1f3a66d0d" + } + }, + "themeHash": "a1a8437993a02c99489dfdc71ca7e2f5d6447f4956600fd939272816bc0f3f63", + "rendered": { + "width": 64, + "height": 64 + }, + "flattened": { + "canvas": [ + 30, + 30, + 30 + ], + "alpha": 0 + }, + "environmentStatus": "valid", + "compare": { + "exit": 1, + "stdout": "{\"status\":\"mismatch\",\"referenceDimensions\":[64,64],\"actualDimensions\":[64,64],\"changedPixels\":110,\"totalPixels\":4096,\"changedRatio\":0.02685546875,\"maxChangedRatio\":0.005,\"channelTolerance\":24,\"maxChannelDelta\":182,\"diffPath\":\"C:\\\\Users\\\\owjs3\\\\orca\\\\workspaces\\\\devup-mcp\\\\W24-C-grid\\\\harness\\\\render\\\\out\\\\keyframes-458-2021.diff.png\"}", + "stderr": "" + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 64, + 64 + ], + "actualDimensions": [ + 64, + 64 + ], + "changedPixels": 110, + "totalPixels": 4096, + "changedRatio": 0.02685546875, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 182, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W24-C-grid\\harness\\render\\out\\keyframes-458-2021.diff.png" + } + } + ], + [ + { + "name": "grid-429-1966", + "frame": "429:1966", + "viewport": { + "width": 1281, + "height": 1086 + }, + "reference": "out/grid-429-1966.reference.png", + "actual": "out/grid-429-1966.actual.png", + "acquisition": { + "binarySha256": "27ca7e30f7fea3f1e76fe6e5049e46d1b5461d2b461a7bf8d7e0fef864c831c7", + "server": { + "version": "0.4.6", + "buildId": "937313e39448", + "commit": "937313e39448", + "displayVersion": "0.4.6+937313e39448", + "identityGuidance": "Identify deployments by commit/buildId, not version alone. If the expected commit/buildId differs, reconnect or restart the client MCP server connection after updating the binary.", + "updateAvailable": { + "current": "0.4.6", + "state": "unknown", + "note": "The newest release is not known: the check has not run yet, or it could not reach the network. This is an absent answer, not a failure, and it never delays a call." + } + }, + "responsePath": "out/grid-429-1966-429-1966.response.json", + "files": { + "src/screens/grid-429-1966.tsx": "6b16b8f79f4ecf590a24a1c13af67b488afc08a2d513d156e000c20728c1b0d2", + "themes/grid-429-1966.json": "a1a8437993a02c99489dfdc71ca7e2f5d6447f4956600fd939272816bc0f3f63", + "out/grid-429-1966.reference.png": "251925cfa907bcb24ff2077cbf81a778a0be9a9df62a9532359bea231f468e10", + "out/grid-429-1966-429-1966.snapshot.json": "9de5a06b83300efc89c2b02b21f0b7af0f71326accac1ad9dfe62a88c3bd6c02", + "public/images/Frame-506-429-1967-986461bdbd3b.png": "8722fc62d4e2e2395697bad982d1d28d159d10b15b0d38b09535e78232ea4ed6", + "public/images/Frame-508-429-1968-c886d36997c5.png": "7f8167a9cd5504e7a5e3a386993e6b6eb1dbd21753a86b940ecd4084c65983b7", + "public/images/Frame-509-429-1969-a6034b24119a.png": "e13b27fae8519c989ccda979e02377c63ed659b6105ce2263f227bae789bb1b8", + "public/images/Frame-507-429-1970-021ef10975df.png": "1fd831e6b6aab7c067a2d57fb06d42738fffe7bdf69c3ffbe9cd89fc1d9a9746", + "public/images/Frame-510-429-1971-40e88a5fbe9d.png": "83b2e86d2e4017e1a0996b56d76162ed2de8d6002918fb30aa1b4b083a33cc61", + "public/images/Frame-511-429-1972-f549097083e6.png": "d005a60f6b3f5d904c8f41f6fca683179e549e8416cee9fec6819e25e6d9d3d7" + } + }, + "themeHash": "a1a8437993a02c99489dfdc71ca7e2f5d6447f4956600fd939272816bc0f3f63", + "rendered": { + "width": 1281, + "height": 1086 + }, + "flattened": { + "canvas": [ + 30, + 30, + 30 + ], + "alpha": 0 + }, + "environmentStatus": "valid", + "compare": { + "exit": 1, + "stdout": "{\"status\":\"mismatch\",\"referenceDimensions\":[1281,1086],\"actualDimensions\":[1281,1086],\"changedPixels\":41234,\"totalPixels\":1391166,\"changedRatio\":0.029639884816046395,\"maxChangedRatio\":0.005,\"channelTolerance\":24,\"maxChannelDelta\":176,\"diffPath\":\"C:\\\\Users\\\\owjs3\\\\orca\\\\workspaces\\\\devup-mcp\\\\W24-C-grid\\\\harness\\\\render\\\\out\\\\grid-429-1966.diff.png\"}", + "stderr": "" + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 1281, + 1086 + ], + "actualDimensions": [ + 1281, + 1086 + ], + "changedPixels": 41234, + "totalPixels": 1391166, + "changedRatio": 0.029639884816046395, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 176, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W24-C-grid\\harness\\render\\out\\grid-429-1966.diff.png" + } + }, + { + "name": "keyframes-458-2021", + "frame": "458:2021", + "viewport": { + "width": 64, + "height": 64 + }, + "reference": "out/keyframes-458-2021.reference.png", + "actual": "out/keyframes-458-2021.actual.png", + "acquisition": { + "binarySha256": "27ca7e30f7fea3f1e76fe6e5049e46d1b5461d2b461a7bf8d7e0fef864c831c7", + "server": { + "version": "0.4.6", + "buildId": "937313e39448", + "commit": "937313e39448", + "displayVersion": "0.4.6+937313e39448", + "identityGuidance": "Identify deployments by commit/buildId, not version alone. If the expected commit/buildId differs, reconnect or restart the client MCP server connection after updating the binary.", + "updateAvailable": { + "current": "0.4.6", + "state": "unknown", + "note": "The newest release is not known: the check has not run yet, or it could not reach the network. This is an absent answer, not a failure, and it never delays a call." + } + }, + "responsePath": "out/keyframes-458-2021-458-2021.response.json", + "files": { + "src/screens/keyframes-458-2021.tsx": "f9e4d334a007caf23cc45575ea1a93a33b3b90abb5b8bc416952745072c6a935", + "themes/keyframes-458-2021.json": "a1a8437993a02c99489dfdc71ca7e2f5d6447f4956600fd939272816bc0f3f63", + "out/keyframes-458-2021.reference.png": "94ff08ecd5dac40feeb9ba154e40f0f527dbcaa31c02f5cbf0c03dae25ede191", + "out/keyframes-458-2021-458-2021.snapshot.json": "8ae3430b3818eabbdaae857264cdc505a5fbed16831041e2e747d4a1f3a66d0d" + } + }, + "themeHash": "a1a8437993a02c99489dfdc71ca7e2f5d6447f4956600fd939272816bc0f3f63", + "rendered": { + "width": 64, + "height": 64 + }, + "flattened": { + "canvas": [ + 30, + 30, + 30 + ], + "alpha": 0 + }, + "environmentStatus": "valid", + "compare": { + "exit": 1, + "stdout": "{\"status\":\"mismatch\",\"referenceDimensions\":[64,64],\"actualDimensions\":[64,64],\"changedPixels\":110,\"totalPixels\":4096,\"changedRatio\":0.02685546875,\"maxChangedRatio\":0.005,\"channelTolerance\":24,\"maxChannelDelta\":182,\"diffPath\":\"C:\\\\Users\\\\owjs3\\\\orca\\\\workspaces\\\\devup-mcp\\\\W24-C-grid\\\\harness\\\\render\\\\out\\\\keyframes-458-2021.diff.png\"}", + "stderr": "" + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 64, + 64 + ], + "actualDimensions": [ + 64, + 64 + ], + "changedPixels": 110, + "totalPixels": 4096, + "changedRatio": 0.02685546875, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 182, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W24-C-grid\\harness\\render\\out\\keyframes-458-2021.diff.png" + } + } + ] + ], + "baselineActualHashes": { + "w24-baseline-grid.png": "a7ea4c4023061e9851972a8ad633af22fa160a0d610621d98e00529959cab69f", + "w24-baseline-keyframes.png": "15ae0b08ed2f797bd710d029adddec69d3273b6b214304ebf359e30a8c088764" + }, + "pairedProbes": [ + { + "baseline": { + "total": 41234, + "per": [ + 0, + 0, + 0, + 24299, + 10488, + 6447 + ], + "other": 0, + "grid": { + "width": 1281, + "height": 1085.328125, + "cols": "413.328px 413.672px 413.5px", + "rows": "348px 349px 348.328px" + }, + "imgs": [ + { + "src": "/images/Frame-506-429-1967-986461bdbd3b.png", + "x": 0, + "y": 0, + "w": 847, + "h": 348, + "nw": 847, + "nh": 348, + "exportAtRoundedOriginChanged": 0 + }, + { + "src": "/images/Frame-508-429-1968-c886d36997c5.png", + "x": 867, + "y": 0, + "w": 413, + "h": 348, + "nw": 413, + "nh": 348, + "exportAtRoundedOriginChanged": 0 + }, + { + "src": "/images/Frame-509-429-1969-a6034b24119a.png", + "x": 0, + "y": 368, + "w": 413, + "h": 717, + "nw": 413, + "nh": 717, + "exportAtRoundedOriginChanged": 0 + }, + { + "src": "/images/Frame-507-429-1970-021ef10975df.png", + "x": 433.328125, + "y": 368, + "w": 847, + "h": 349, + "nw": 847, + "nh": 349, + "exportAtRoundedOriginChanged": 24299 + }, + { + "src": "/images/Frame-510-429-1971-40e88a5fbe9d.png", + "x": 433.328125, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349, + "exportAtRoundedOriginChanged": 4709 + }, + { + "src": "/images/Frame-511-429-1972-f549097083e6.png", + "x": 867, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349, + "exportAtRoundedOriginChanged": 4 + } + ], + "keyframesChanged": 110 + }, + "exact-size": { + "total": 41234, + "per": [ + 0, + 0, + 0, + 24299, + 10488, + 6447 + ], + "other": 0, + "grid": { + "width": 1281, + "height": 1085.328125, + "cols": "413.328px 413.672px 413.5px", + "rows": "348px 349px 348.328px" + }, + "imgs": [ + { + "src": "/images/Frame-506-429-1967-986461bdbd3b.png", + "x": 0, + "y": 0, + "w": 847, + "h": 348, + "nw": 847, + "nh": 348 + }, + { + "src": "/images/Frame-508-429-1968-c886d36997c5.png", + "x": 867, + "y": 0, + "w": 413, + "h": 348, + "nw": 413, + "nh": 348 + }, + { + "src": "/images/Frame-509-429-1969-a6034b24119a.png", + "x": 0, + "y": 368, + "w": 413, + "h": 717, + "nw": 413, + "nh": 717 + }, + { + "src": "/images/Frame-507-429-1970-021ef10975df.png", + "x": 433.328125, + "y": 368, + "w": 847, + "h": 349, + "nw": 847, + "nh": 349 + }, + { + "src": "/images/Frame-510-429-1971-40e88a5fbe9d.png", + "x": 433.328125, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + }, + { + "src": "/images/Frame-511-429-1972-f549097083e6.png", + "x": 867, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + } + ], + "keyframesChanged": 110 + }, + "source-position": { + "total": 41234, + "per": [ + 0, + 0, + 0, + 24299, + 10488, + 6447 + ], + "other": 0, + "grid": { + "width": 1281, + "height": 40, + "cols": "0px 0px 0px", + "rows": "0px 0px 0px" + }, + "imgs": [ + { + "src": "/images/Frame-506-429-1967-986461bdbd3b.png", + "x": 0, + "y": 0, + "w": 847, + "h": 348, + "nw": 847, + "nh": 348 + }, + { + "src": "/images/Frame-508-429-1968-c886d36997c5.png", + "x": 867, + "y": 0, + "w": 413, + "h": 348, + "nw": 413, + "nh": 348 + }, + { + "src": "/images/Frame-509-429-1969-a6034b24119a.png", + "x": 0, + "y": 368, + "w": 413, + "h": 717, + "nw": 413, + "nh": 717 + }, + { + "src": "/images/Frame-507-429-1970-021ef10975df.png", + "x": 433.328125, + "y": 368, + "w": 847, + "h": 349, + "nw": 847, + "nh": 349 + }, + { + "src": "/images/Frame-510-429-1971-40e88a5fbe9d.png", + "x": 433.328125, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + }, + { + "src": "/images/Frame-511-429-1972-f549097083e6.png", + "x": 867, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + } + ], + "keyframesChanged": 110 + }, + "rounded-position": { + "total": 47524, + "per": [ + 0, + 0, + 0, + 24299, + 16778, + 6447 + ], + "other": 0, + "grid": { + "width": 1281, + "height": 40, + "cols": "0px 0px 0px", + "rows": "0px 0px 0px" + }, + "imgs": [ + { + "src": "/images/Frame-506-429-1967-986461bdbd3b.png", + "x": 0, + "y": 0, + "w": 847, + "h": 348, + "nw": 847, + "nh": 348 + }, + { + "src": "/images/Frame-508-429-1968-c886d36997c5.png", + "x": 867, + "y": 0, + "w": 413, + "h": 348, + "nw": 413, + "nh": 348 + }, + { + "src": "/images/Frame-509-429-1969-a6034b24119a.png", + "x": 0, + "y": 368, + "w": 413, + "h": 717, + "nw": 413, + "nh": 717 + }, + { + "src": "/images/Frame-507-429-1970-021ef10975df.png", + "x": 433, + "y": 368, + "w": 847, + "h": 349, + "nw": 847, + "nh": 349 + }, + { + "src": "/images/Frame-510-429-1971-40e88a5fbe9d.png", + "x": 433, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + }, + { + "src": "/images/Frame-511-429-1972-f549097083e6.png", + "x": 867, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + } + ], + "keyframesChanged": 110 + }, + "natural-size": { + "total": 29333, + "per": [ + 0, + 0, + 0, + 24299, + 5028, + 6 + ], + "other": 0, + "grid": { + "width": 1281, + "height": 1085.328125, + "cols": "413.328px 413.672px 413.5px", + "rows": "348px 349px 348.328px" + }, + "imgs": [ + { + "src": "/images/Frame-506-429-1967-986461bdbd3b.png", + "x": 0, + "y": 0, + "w": 847, + "h": 348, + "nw": 847, + "nh": 348 + }, + { + "src": "/images/Frame-508-429-1968-c886d36997c5.png", + "x": 867, + "y": 0, + "w": 413, + "h": 348, + "nw": 413, + "nh": 348 + }, + { + "src": "/images/Frame-509-429-1969-a6034b24119a.png", + "x": 0, + "y": 368, + "w": 413, + "h": 717, + "nw": 413, + "nh": 717 + }, + { + "src": "/images/Frame-507-429-1970-021ef10975df.png", + "x": 433.328125, + "y": 368, + "w": 847, + "h": 349, + "nw": 847, + "nh": 349 + }, + { + "src": "/images/Frame-510-429-1971-40e88a5fbe9d.png", + "x": 433.328125, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + }, + { + "src": "/images/Frame-511-429-1972-f549097083e6.png", + "x": 867, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + } + ], + "keyframesChanged": 110 + }, + "natural-source-position": { + "total": 29333, + "per": [ + 0, + 0, + 0, + 24299, + 5028, + 6 + ], + "other": 0, + "grid": { + "width": 1281, + "height": 40, + "cols": "0px 0px 0px", + "rows": "0px 0px 0px" + }, + "imgs": [ + { + "src": "/images/Frame-506-429-1967-986461bdbd3b.png", + "x": 0, + "y": 0, + "w": 847, + "h": 348, + "nw": 847, + "nh": 348 + }, + { + "src": "/images/Frame-508-429-1968-c886d36997c5.png", + "x": 867, + "y": 0, + "w": 413, + "h": 348, + "nw": 413, + "nh": 348 + }, + { + "src": "/images/Frame-509-429-1969-a6034b24119a.png", + "x": 0, + "y": 368, + "w": 413, + "h": 717, + "nw": 413, + "nh": 717 + }, + { + "src": "/images/Frame-507-429-1970-021ef10975df.png", + "x": 433.328125, + "y": 368, + "w": 847, + "h": 349, + "nw": 847, + "nh": 349 + }, + { + "src": "/images/Frame-510-429-1971-40e88a5fbe9d.png", + "x": 433.328125, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + }, + { + "src": "/images/Frame-511-429-1972-f549097083e6.png", + "x": 867, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + } + ], + "keyframesChanged": 110 + }, + "compositor": { + "total": 41234, + "per": [ + 0, + 0, + 0, + 24299, + 10488, + 6447 + ], + "other": 0, + "grid": { + "width": 1281, + "height": 1085.328125, + "cols": "413.328px 413.672px 413.5px", + "rows": "348px 349px 348.328px" + }, + "imgs": [ + { + "src": "/images/Frame-506-429-1967-986461bdbd3b.png", + "x": 0, + "y": 0, + "w": 847, + "h": 348, + "nw": 847, + "nh": 348 + }, + { + "src": "/images/Frame-508-429-1968-c886d36997c5.png", + "x": 867, + "y": 0, + "w": 413, + "h": 348, + "nw": 413, + "nh": 348 + }, + { + "src": "/images/Frame-509-429-1969-a6034b24119a.png", + "x": 0, + "y": 368, + "w": 413, + "h": 717, + "nw": 413, + "nh": 717 + }, + { + "src": "/images/Frame-507-429-1970-021ef10975df.png", + "x": 433.328125, + "y": 368, + "w": 847, + "h": 349, + "nw": 847, + "nh": 349 + }, + { + "src": "/images/Frame-510-429-1971-40e88a5fbe9d.png", + "x": 433.328125, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + }, + { + "src": "/images/Frame-511-429-1972-f549097083e6.png", + "x": 867, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + } + ], + "keyframesChanged": 110 + }, + "natural-compositor": { + "total": 29333, + "per": [ + 0, + 0, + 0, + 24299, + 5028, + 6 + ], + "other": 0, + "grid": { + "width": 1281, + "height": 1085.328125, + "cols": "413.328px 413.672px 413.5px", + "rows": "348px 349px 348.328px" + }, + "imgs": [ + { + "src": "/images/Frame-506-429-1967-986461bdbd3b.png", + "x": 0, + "y": 0, + "w": 847, + "h": 348, + "nw": 847, + "nh": 348 + }, + { + "src": "/images/Frame-508-429-1968-c886d36997c5.png", + "x": 867, + "y": 0, + "w": 413, + "h": 348, + "nw": 413, + "nh": 348 + }, + { + "src": "/images/Frame-509-429-1969-a6034b24119a.png", + "x": 0, + "y": 368, + "w": 413, + "h": 717, + "nw": 413, + "nh": 717 + }, + { + "src": "/images/Frame-507-429-1970-021ef10975df.png", + "x": 433.328125, + "y": 368, + "w": 847, + "h": 349, + "nw": 847, + "nh": 349 + }, + { + "src": "/images/Frame-510-429-1971-40e88a5fbe9d.png", + "x": 433.328125, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + }, + { + "src": "/images/Frame-511-429-1972-f549097083e6.png", + "x": 867, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + } + ], + "keyframesChanged": 110 + }, + "svg": { + "total": 39806, + "per": [ + 0, + 0, + 0, + 24299, + 12236, + 3271 + ], + "other": 0, + "grid": { + "width": 1281, + "height": 1085.328125, + "cols": "413.328px 413.672px 413.5px", + "rows": "348px 349px 348.328px" + }, + "imgs": [ + { + "src": "/images/Frame-506-429-1967-986461bdbd3b.png", + "x": 0, + "y": 0, + "w": 847, + "h": 348, + "nw": 847, + "nh": 348 + }, + { + "src": "/images/Frame-508-429-1968-c886d36997c5.png", + "x": 867, + "y": 0, + "w": 413, + "h": 348, + "nw": 413, + "nh": 348 + }, + { + "src": "/images/Frame-509-429-1969-a6034b24119a.png", + "x": 0, + "y": 368, + "w": 413, + "h": 717, + "nw": 413, + "nh": 717 + }, + { + "src": "/images/Frame-507-429-1970-021ef10975df.png", + "x": 433.328125, + "y": 368, + "w": 847, + "h": 349, + "nw": 847, + "nh": 349 + }, + { + "src": "/images/Frame-510-429-1971-40e88a5fbe9d.png", + "x": 433.328125, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + }, + { + "src": "/images/Frame-511-429-1972-f549097083e6.png", + "x": 867, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + } + ], + "keyframesChanged": 110 + }, + "natural-svg": { + "total": 29333, + "per": [ + 0, + 0, + 0, + 24299, + 5028, + 6 + ], + "other": 0, + "grid": { + "width": 1281, + "height": 1085.328125, + "cols": "413.328px 413.672px 413.5px", + "rows": "348px 349px 348.328px" + }, + "imgs": [ + { + "src": "/images/Frame-506-429-1967-986461bdbd3b.png", + "x": 0, + "y": 0, + "w": 847, + "h": 348, + "nw": 847, + "nh": 348 + }, + { + "src": "/images/Frame-508-429-1968-c886d36997c5.png", + "x": 867, + "y": 0, + "w": 413, + "h": 348, + "nw": 413, + "nh": 348 + }, + { + "src": "/images/Frame-509-429-1969-a6034b24119a.png", + "x": 0, + "y": 368, + "w": 413, + "h": 717, + "nw": 413, + "nh": 717 + }, + { + "src": "/images/Frame-507-429-1970-021ef10975df.png", + "x": 433.328125, + "y": 368, + "w": 847, + "h": 349, + "nw": 847, + "nh": 349 + }, + { + "src": "/images/Frame-510-429-1971-40e88a5fbe9d.png", + "x": 433.328125, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + }, + { + "src": "/images/Frame-511-429-1972-f549097083e6.png", + "x": 867, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + } + ], + "keyframesChanged": 110 + } + }, + { + "baseline": { + "total": 41234, + "per": [ + 0, + 0, + 0, + 24299, + 10488, + 6447 + ], + "other": 0, + "grid": { + "width": 1281, + "height": 1085.328125, + "cols": "413.328px 413.672px 413.5px", + "rows": "348px 349px 348.328px" + }, + "imgs": [ + { + "src": "/images/Frame-506-429-1967-986461bdbd3b.png", + "x": 0, + "y": 0, + "w": 847, + "h": 348, + "nw": 847, + "nh": 348, + "exportAtRoundedOriginChanged": 0 + }, + { + "src": "/images/Frame-508-429-1968-c886d36997c5.png", + "x": 867, + "y": 0, + "w": 413, + "h": 348, + "nw": 413, + "nh": 348, + "exportAtRoundedOriginChanged": 0 + }, + { + "src": "/images/Frame-509-429-1969-a6034b24119a.png", + "x": 0, + "y": 368, + "w": 413, + "h": 717, + "nw": 413, + "nh": 717, + "exportAtRoundedOriginChanged": 0 + }, + { + "src": "/images/Frame-507-429-1970-021ef10975df.png", + "x": 433.328125, + "y": 368, + "w": 847, + "h": 349, + "nw": 847, + "nh": 349, + "exportAtRoundedOriginChanged": 24299 + }, + { + "src": "/images/Frame-510-429-1971-40e88a5fbe9d.png", + "x": 433.328125, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349, + "exportAtRoundedOriginChanged": 4709 + }, + { + "src": "/images/Frame-511-429-1972-f549097083e6.png", + "x": 867, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349, + "exportAtRoundedOriginChanged": 4 + } + ], + "keyframesChanged": 110 + }, + "exact-size": { + "total": 41234, + "per": [ + 0, + 0, + 0, + 24299, + 10488, + 6447 + ], + "other": 0, + "grid": { + "width": 1281, + "height": 1085.328125, + "cols": "413.328px 413.672px 413.5px", + "rows": "348px 349px 348.328px" + }, + "imgs": [ + { + "src": "/images/Frame-506-429-1967-986461bdbd3b.png", + "x": 0, + "y": 0, + "w": 847, + "h": 348, + "nw": 847, + "nh": 348 + }, + { + "src": "/images/Frame-508-429-1968-c886d36997c5.png", + "x": 867, + "y": 0, + "w": 413, + "h": 348, + "nw": 413, + "nh": 348 + }, + { + "src": "/images/Frame-509-429-1969-a6034b24119a.png", + "x": 0, + "y": 368, + "w": 413, + "h": 717, + "nw": 413, + "nh": 717 + }, + { + "src": "/images/Frame-507-429-1970-021ef10975df.png", + "x": 433.328125, + "y": 368, + "w": 847, + "h": 349, + "nw": 847, + "nh": 349 + }, + { + "src": "/images/Frame-510-429-1971-40e88a5fbe9d.png", + "x": 433.328125, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + }, + { + "src": "/images/Frame-511-429-1972-f549097083e6.png", + "x": 867, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + } + ], + "keyframesChanged": 110 + }, + "source-position": { + "total": 41234, + "per": [ + 0, + 0, + 0, + 24299, + 10488, + 6447 + ], + "other": 0, + "grid": { + "width": 1281, + "height": 40, + "cols": "0px 0px 0px", + "rows": "0px 0px 0px" + }, + "imgs": [ + { + "src": "/images/Frame-506-429-1967-986461bdbd3b.png", + "x": 0, + "y": 0, + "w": 847, + "h": 348, + "nw": 847, + "nh": 348 + }, + { + "src": "/images/Frame-508-429-1968-c886d36997c5.png", + "x": 867, + "y": 0, + "w": 413, + "h": 348, + "nw": 413, + "nh": 348 + }, + { + "src": "/images/Frame-509-429-1969-a6034b24119a.png", + "x": 0, + "y": 368, + "w": 413, + "h": 717, + "nw": 413, + "nh": 717 + }, + { + "src": "/images/Frame-507-429-1970-021ef10975df.png", + "x": 433.328125, + "y": 368, + "w": 847, + "h": 349, + "nw": 847, + "nh": 349 + }, + { + "src": "/images/Frame-510-429-1971-40e88a5fbe9d.png", + "x": 433.328125, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + }, + { + "src": "/images/Frame-511-429-1972-f549097083e6.png", + "x": 867, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + } + ], + "keyframesChanged": 110 + }, + "rounded-position": { + "total": 47524, + "per": [ + 0, + 0, + 0, + 24299, + 16778, + 6447 + ], + "other": 0, + "grid": { + "width": 1281, + "height": 40, + "cols": "0px 0px 0px", + "rows": "0px 0px 0px" + }, + "imgs": [ + { + "src": "/images/Frame-506-429-1967-986461bdbd3b.png", + "x": 0, + "y": 0, + "w": 847, + "h": 348, + "nw": 847, + "nh": 348 + }, + { + "src": "/images/Frame-508-429-1968-c886d36997c5.png", + "x": 867, + "y": 0, + "w": 413, + "h": 348, + "nw": 413, + "nh": 348 + }, + { + "src": "/images/Frame-509-429-1969-a6034b24119a.png", + "x": 0, + "y": 368, + "w": 413, + "h": 717, + "nw": 413, + "nh": 717 + }, + { + "src": "/images/Frame-507-429-1970-021ef10975df.png", + "x": 433, + "y": 368, + "w": 847, + "h": 349, + "nw": 847, + "nh": 349 + }, + { + "src": "/images/Frame-510-429-1971-40e88a5fbe9d.png", + "x": 433, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + }, + { + "src": "/images/Frame-511-429-1972-f549097083e6.png", + "x": 867, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + } + ], + "keyframesChanged": 110 + }, + "natural-size": { + "total": 29333, + "per": [ + 0, + 0, + 0, + 24299, + 5028, + 6 + ], + "other": 0, + "grid": { + "width": 1281, + "height": 1085.328125, + "cols": "413.328px 413.672px 413.5px", + "rows": "348px 349px 348.328px" + }, + "imgs": [ + { + "src": "/images/Frame-506-429-1967-986461bdbd3b.png", + "x": 0, + "y": 0, + "w": 847, + "h": 348, + "nw": 847, + "nh": 348 + }, + { + "src": "/images/Frame-508-429-1968-c886d36997c5.png", + "x": 867, + "y": 0, + "w": 413, + "h": 348, + "nw": 413, + "nh": 348 + }, + { + "src": "/images/Frame-509-429-1969-a6034b24119a.png", + "x": 0, + "y": 368, + "w": 413, + "h": 717, + "nw": 413, + "nh": 717 + }, + { + "src": "/images/Frame-507-429-1970-021ef10975df.png", + "x": 433.328125, + "y": 368, + "w": 847, + "h": 349, + "nw": 847, + "nh": 349 + }, + { + "src": "/images/Frame-510-429-1971-40e88a5fbe9d.png", + "x": 433.328125, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + }, + { + "src": "/images/Frame-511-429-1972-f549097083e6.png", + "x": 867, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + } + ], + "keyframesChanged": 110 + }, + "natural-source-position": { + "total": 29333, + "per": [ + 0, + 0, + 0, + 24299, + 5028, + 6 + ], + "other": 0, + "grid": { + "width": 1281, + "height": 40, + "cols": "0px 0px 0px", + "rows": "0px 0px 0px" + }, + "imgs": [ + { + "src": "/images/Frame-506-429-1967-986461bdbd3b.png", + "x": 0, + "y": 0, + "w": 847, + "h": 348, + "nw": 847, + "nh": 348 + }, + { + "src": "/images/Frame-508-429-1968-c886d36997c5.png", + "x": 867, + "y": 0, + "w": 413, + "h": 348, + "nw": 413, + "nh": 348 + }, + { + "src": "/images/Frame-509-429-1969-a6034b24119a.png", + "x": 0, + "y": 368, + "w": 413, + "h": 717, + "nw": 413, + "nh": 717 + }, + { + "src": "/images/Frame-507-429-1970-021ef10975df.png", + "x": 433.328125, + "y": 368, + "w": 847, + "h": 349, + "nw": 847, + "nh": 349 + }, + { + "src": "/images/Frame-510-429-1971-40e88a5fbe9d.png", + "x": 433.328125, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + }, + { + "src": "/images/Frame-511-429-1972-f549097083e6.png", + "x": 867, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + } + ], + "keyframesChanged": 110 + }, + "compositor": { + "total": 41234, + "per": [ + 0, + 0, + 0, + 24299, + 10488, + 6447 + ], + "other": 0, + "grid": { + "width": 1281, + "height": 1085.328125, + "cols": "413.328px 413.672px 413.5px", + "rows": "348px 349px 348.328px" + }, + "imgs": [ + { + "src": "/images/Frame-506-429-1967-986461bdbd3b.png", + "x": 0, + "y": 0, + "w": 847, + "h": 348, + "nw": 847, + "nh": 348 + }, + { + "src": "/images/Frame-508-429-1968-c886d36997c5.png", + "x": 867, + "y": 0, + "w": 413, + "h": 348, + "nw": 413, + "nh": 348 + }, + { + "src": "/images/Frame-509-429-1969-a6034b24119a.png", + "x": 0, + "y": 368, + "w": 413, + "h": 717, + "nw": 413, + "nh": 717 + }, + { + "src": "/images/Frame-507-429-1970-021ef10975df.png", + "x": 433.328125, + "y": 368, + "w": 847, + "h": 349, + "nw": 847, + "nh": 349 + }, + { + "src": "/images/Frame-510-429-1971-40e88a5fbe9d.png", + "x": 433.328125, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + }, + { + "src": "/images/Frame-511-429-1972-f549097083e6.png", + "x": 867, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + } + ], + "keyframesChanged": 110 + }, + "natural-compositor": { + "total": 29333, + "per": [ + 0, + 0, + 0, + 24299, + 5028, + 6 + ], + "other": 0, + "grid": { + "width": 1281, + "height": 1085.328125, + "cols": "413.328px 413.672px 413.5px", + "rows": "348px 349px 348.328px" + }, + "imgs": [ + { + "src": "/images/Frame-506-429-1967-986461bdbd3b.png", + "x": 0, + "y": 0, + "w": 847, + "h": 348, + "nw": 847, + "nh": 348 + }, + { + "src": "/images/Frame-508-429-1968-c886d36997c5.png", + "x": 867, + "y": 0, + "w": 413, + "h": 348, + "nw": 413, + "nh": 348 + }, + { + "src": "/images/Frame-509-429-1969-a6034b24119a.png", + "x": 0, + "y": 368, + "w": 413, + "h": 717, + "nw": 413, + "nh": 717 + }, + { + "src": "/images/Frame-507-429-1970-021ef10975df.png", + "x": 433.328125, + "y": 368, + "w": 847, + "h": 349, + "nw": 847, + "nh": 349 + }, + { + "src": "/images/Frame-510-429-1971-40e88a5fbe9d.png", + "x": 433.328125, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + }, + { + "src": "/images/Frame-511-429-1972-f549097083e6.png", + "x": 867, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + } + ], + "keyframesChanged": 110 + }, + "svg": { + "total": 39806, + "per": [ + 0, + 0, + 0, + 24299, + 12236, + 3271 + ], + "other": 0, + "grid": { + "width": 1281, + "height": 1085.328125, + "cols": "413.328px 413.672px 413.5px", + "rows": "348px 349px 348.328px" + }, + "imgs": [ + { + "src": "/images/Frame-506-429-1967-986461bdbd3b.png", + "x": 0, + "y": 0, + "w": 847, + "h": 348, + "nw": 847, + "nh": 348 + }, + { + "src": "/images/Frame-508-429-1968-c886d36997c5.png", + "x": 867, + "y": 0, + "w": 413, + "h": 348, + "nw": 413, + "nh": 348 + }, + { + "src": "/images/Frame-509-429-1969-a6034b24119a.png", + "x": 0, + "y": 368, + "w": 413, + "h": 717, + "nw": 413, + "nh": 717 + }, + { + "src": "/images/Frame-507-429-1970-021ef10975df.png", + "x": 433.328125, + "y": 368, + "w": 847, + "h": 349, + "nw": 847, + "nh": 349 + }, + { + "src": "/images/Frame-510-429-1971-40e88a5fbe9d.png", + "x": 433.328125, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + }, + { + "src": "/images/Frame-511-429-1972-f549097083e6.png", + "x": 867, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + } + ], + "keyframesChanged": 110 + }, + "natural-svg": { + "total": 29333, + "per": [ + 0, + 0, + 0, + 24299, + 5028, + 6 + ], + "other": 0, + "grid": { + "width": 1281, + "height": 1085.328125, + "cols": "413.328px 413.672px 413.5px", + "rows": "348px 349px 348.328px" + }, + "imgs": [ + { + "src": "/images/Frame-506-429-1967-986461bdbd3b.png", + "x": 0, + "y": 0, + "w": 847, + "h": 348, + "nw": 847, + "nh": 348 + }, + { + "src": "/images/Frame-508-429-1968-c886d36997c5.png", + "x": 867, + "y": 0, + "w": 413, + "h": 348, + "nw": 413, + "nh": 348 + }, + { + "src": "/images/Frame-509-429-1969-a6034b24119a.png", + "x": 0, + "y": 368, + "w": 413, + "h": 717, + "nw": 413, + "nh": 717 + }, + { + "src": "/images/Frame-507-429-1970-021ef10975df.png", + "x": 433.328125, + "y": 368, + "w": 847, + "h": 349, + "nw": 847, + "nh": 349 + }, + { + "src": "/images/Frame-510-429-1971-40e88a5fbe9d.png", + "x": 433.328125, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + }, + { + "src": "/images/Frame-511-429-1972-f549097083e6.png", + "x": 867, + "y": 737, + "w": 413.328125, + "h": 348.328125, + "nw": 414, + "nh": 349 + } + ], + "keyframesChanged": 110 + } + } + ], + "pixelAnalysis": { + "images": [ + { + "id": "429:1967", + "source": { + "parentId": "429:1966", + "absoluteBoundingBox": { + "height": 348, + "width": 847, + "x": 13192, + "y": 792 + }, + "absoluteRenderBounds": { + "height": 348, + "width": 847, + "x": 13192, + "y": 792 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "3db1cf828053e87c2b6a4d8923477b2aa5d5ef3d", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "rotation": 0, + "scaleMode": "FILL", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + } + ], + "gridColumnAnchorIndex": 0, + "gridColumnSpan": 2, + "gridRowAnchorIndex": 0, + "height": 348, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 506", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 847, + "x": 0, + "y": 0 + }, + "exportSize": [ + 847, + 348 + ], + "naturalAtRoundedOrigin": 0, + "bestInteriorShifts": [ + { + "dx": 0, + "dy": 0, + "changedInterior": 0 + }, + { + "dx": 0, + "dy": -0.3333333333333333, + "changedInterior": 6788 + }, + { + "dx": 0, + "dy": 0.3333333333333333, + "changedInterior": 6860 + }, + { + "dx": -0.3333333333333333, + "dy": 0, + "changedInterior": 9375 + }, + { + "dx": 0.3333333333333333, + "dy": 0, + "changedInterior": 9420 + } + ] + }, + { + "id": "429:1968", + "source": { + "parentId": "429:1966", + "absoluteBoundingBox": { + "height": 348, + "width": 413, + "x": 14059, + "y": 792 + }, + "absoluteRenderBounds": { + "height": 348, + "width": 413, + "x": 14059, + "y": 792 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "22acb2dc595e1b09b8423aae475b6798f4d9c934", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "rotation": 0, + "scaleMode": "FILL", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + } + ], + "gridColumnAnchorIndex": 2, + "gridRowAnchorIndex": 0, + "height": 348, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 508", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 413, + "x": 867, + "y": 0 + }, + "exportSize": [ + 413, + 348 + ], + "naturalAtRoundedOrigin": 0, + "bestInteriorShifts": [ + { + "dx": 0, + "dy": 0, + "changedInterior": 0 + }, + { + "dx": 0, + "dy": 0.3333333333333333, + "changedInterior": 2924 + }, + { + "dx": 0, + "dy": -0.3333333333333333, + "changedInterior": 2926 + }, + { + "dx": -0.3333333333333333, + "dy": 0, + "changedInterior": 3629 + }, + { + "dx": 0.3333333333333333, + "dy": 0, + "changedInterior": 3630 + } + ] + }, + { + "id": "429:1969", + "source": { + "parentId": "429:1966", + "absoluteBoundingBox": { + "height": 717, + "width": 413, + "x": 13192, + "y": 1160 + }, + "absoluteRenderBounds": { + "height": 717, + "width": 413, + "x": 13192, + "y": 1160 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "df74260700140ea232b5ef3fda309d4cfc0dba36", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "rotation": 0, + "scaleMode": "FILL", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + } + ], + "gridColumnAnchorIndex": 0, + "gridRowAnchorIndex": 1, + "gridRowSpan": 2, + "height": 717, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 509", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 413, + "x": 0, + "y": 368 + }, + "exportSize": [ + 413, + 717 + ], + "naturalAtRoundedOrigin": 0, + "bestInteriorShifts": [ + { + "dx": 0, + "dy": 0, + "changedInterior": 0 + }, + { + "dx": 0.3333333333333333, + "dy": 0, + "changedInterior": 1603 + }, + { + "dx": -0.3333333333333333, + "dy": 0, + "changedInterior": 1605 + }, + { + "dx": 0, + "dy": 0.3333333333333333, + "changedInterior": 2049 + }, + { + "dx": 0, + "dy": -0.3333333333333333, + "changedInterior": 2051 + } + ] + }, + { + "id": "429:1970", + "source": { + "parentId": "429:1966", + "absoluteBoundingBox": { + "height": 349, + "width": 847, + "x": 13625.3330078125, + "y": 1160 + }, + "absoluteRenderBounds": { + "height": 349, + "width": 847, + "x": 13625.3330078125, + "y": 1160 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "44c59f89207e33ffc2953c9a49aecf8be9f00fde", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "rotation": 0, + "scaleMode": "FILL", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + } + ], + "gridColumnAnchorIndex": 1, + "gridColumnSpan": 2, + "gridRowAnchorIndex": 1, + "height": 349, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 507", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 847, + "x": 433.3333129882813, + "y": 368 + }, + "exportSize": [ + 847, + 349 + ], + "naturalAtRoundedOrigin": 24299, + "bestInteriorShifts": [ + { + "dx": 0.3333333333333333, + "dy": 0, + "changedInterior": 12230 + }, + { + "dx": 0.3333333333333333, + "dy": -0.3333333333333333, + "changedInterior": 21634 + }, + { + "dx": 0.3333333333333333, + "dy": 0.3333333333333333, + "changedInterior": 21638 + }, + { + "dx": 0, + "dy": 0, + "changedInterior": 23693 + }, + { + "dx": 0.6666666666666666, + "dy": 0, + "changedInterior": 25377 + } + ] + }, + { + "id": "429:1971", + "source": { + "parentId": "429:1966", + "absoluteBoundingBox": { + "height": 348.3333435058594, + "width": 413.3333435058594, + "x": 13625.3330078125, + "y": 1529 + }, + "absoluteRenderBounds": { + "height": 348.3333740234375, + "width": 413.3333435058594, + "x": 13625.3330078125, + "y": 1529 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "67073950e0c93639faeeae00b0bd1a361f9a57f7", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "rotation": 0, + "scaleMode": "FILL", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + } + ], + "gridColumnAnchorIndex": 1, + "gridRowAnchorIndex": 2, + "height": 348.3333435058594, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 510", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 413.3333435058594, + "x": 433.3333129882813, + "y": 737 + }, + "exportSize": [ + 414, + 349 + ], + "naturalAtRoundedOrigin": 4709, + "bestInteriorShifts": [ + { + "dx": 0.3333333333333333, + "dy": 0, + "changedInterior": 1552 + }, + { + "dx": 0, + "dy": 0, + "changedInterior": 4366 + }, + { + "dx": 0.6666666666666666, + "dy": 0, + "changedInterior": 4886 + }, + { + "dx": 0.3333333333333333, + "dy": 0.3333333333333333, + "changedInterior": 5425 + }, + { + "dx": 0.3333333333333333, + "dy": -0.3333333333333333, + "changedInterior": 5455 + } + ] + }, + { + "id": "429:1972", + "source": { + "parentId": "429:1966", + "absoluteBoundingBox": { + "height": 348.3333435058594, + "width": 413.3333435058594, + "x": 14059, + "y": 1529 + }, + "absoluteRenderBounds": { + "height": 348.3333740234375, + "width": 413.3333435058594, + "x": 14059, + "y": 1529 + }, + "bottomLeftRadius": 0, + "bottomRightRadius": 0, + "clipsContent": true, + "constraints": { + "horizontal": "MIN", + "vertical": "MIN" + }, + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "54cc76b68aaa8925c68bf975c3dd1bf69557f69e", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "rotation": 0, + "scaleMode": "FILL", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + } + ], + "gridColumnAnchorIndex": 2, + "gridRowAnchorIndex": 2, + "height": 348.3333435058594, + "isAsset": true, + "itemSpacing": 0, + "layoutGrow": 0, + "layoutMode": "NONE", + "layoutWrap": "NO_WRAP", + "layoutPositioning": "AUTO", + "layoutSizingHorizontal": "FIXED", + "layoutSizingVertical": "FIXED", + "maxHeight": null, + "maxWidth": null, + "name": "Frame 511", + "opacity": 1, + "overflowDirection": "NONE", + "paddingBottom": 0, + "paddingLeft": 0, + "paddingRight": 0, + "paddingTop": 0, + "strokeBottomWeight": 1, + "strokeLeftWeight": 1, + "strokeRightWeight": 1, + "strokeTopWeight": 1, + "strokeWeight": 1, + "topLeftRadius": 0, + "topRightRadius": 0, + "visible": true, + "width": 413.3333435058594, + "x": 867, + "y": 737 + }, + "exportSize": [ + 414, + 349 + ], + "naturalAtRoundedOrigin": 4, + "bestInteriorShifts": [ + { + "dx": 0, + "dy": 0, + "changedInterior": 0 + }, + { + "dx": -0.3333333333333333, + "dy": 0, + "changedInterior": 630 + }, + { + "dx": 0.3333333333333333, + "dy": 0, + "changedInterior": 630 + }, + { + "dx": 0, + "dy": -0.3333333333333333, + "changedInterior": 1076 + }, + { + "dx": 0, + "dy": 0.3333333333333333, + "changedInterior": 1076 + } + ] + } + ], + "bands": [ + { + "y": 0, + "bottom": 100, + "changedPixels": 0 + }, + { + "y": 100, + "bottom": 200, + "changedPixels": 0 + }, + { + "y": 200, + "bottom": 300, + "changedPixels": 0 + }, + { + "y": 300, + "bottom": 400, + "changedPixels": 3251 + }, + { + "y": 400, + "bottom": 500, + "changedPixels": 9290 + }, + { + "y": 500, + "bottom": 600, + "changedPixels": 6829 + }, + { + "y": 600, + "bottom": 700, + "changedPixels": 4914 + }, + { + "y": 700, + "bottom": 800, + "changedPixels": 111 + }, + { + "y": 800, + "bottom": 900, + "changedPixels": 4232 + }, + { + "y": 900, + "bottom": 1000, + "changedPixels": 4908 + }, + { + "y": 1000, + "bottom": 1086, + "changedPixels": 7699 + } + ] + }, + "koreanAllowancePp": 0, + "koreanAllowanceReason": "No text nodes or live text rendering in this grid capture", + "naturalSizeProbeImprovement": { + "changedPixelsRemoved": 11901, + "percentagePoints": 0.8554694407425139, + "isProductionResult": false + }, + "methodology": { + "channelTolerance": 24, + "canvas": [ + 30, + 30, + 30 + ], + "partition": "Union of source asset rectangles using floor(start) and ceil(end), assigned once; gaps have zero differences", + "interiorSampling": "Two-pixel inset; bilinear numeric sampling at stated offsets, diagnostic only", + "probeScript": "import {readFileSync,writeFileSync} from 'node:fs';\nimport {spawn,spawnSync} from 'node:child_process';\nimport {chromium} from 'playwright';\nimport {PNG} from 'pngjs';\nconst snapshot=JSON.parse(readFileSync('out/grid-429-1966-429-1966.snapshot.json'));\nconst fields=snapshot.nodes['429:1966'].fields.childrenIds.map(id=>({id,...snapshot.nodes[id].fields}));\nconst reference=PNG.sync.read(readFileSync('out/grid-429-1966.reference.png'));\nfunction flatten(png){for(let i=0;i0),other=0;for(let y=0;y<1086;y++)for(let x=0;x<1281;x++){let i=(y*1281+x)*4;if([0,1,2].some(c=>Math.abs(png.data[i+c]-reference.data[i+c])>24)){total++;let j=fields.findIndex(f=>x>=Math.floor(f.x)&&x=Math.floor(f.y)&&y=0)per[j]++;else other++;}}return {total,per,other};}\nconst preview=spawn(process.execPath,['node_modules/vite/bin/vite.js','preview','--port','4276','--strictPort'],{stdio:'ignore'});\nconst browser=await chromium.launch();const results={};\ntry{\nfor(let i=0;i<50;i++){try{if((await fetch('http://localhost:4276')).ok)break;}catch{} await new Promise(r=>setTimeout(r,200));}\nconst page=await browser.newPage({viewport:{width:1281,height:1086},deviceScaleFactor:1});\nfor(const mode of ['baseline','exact-size','source-position','rounded-position','natural-size','natural-source-position','compositor','natural-compositor','svg','natural-svg']){\nawait page.goto('http://localhost:4276/?screen=grid-429-1966',{waitUntil:'networkidle'});await page.waitForSelector('body[data-ready=\"1\"]');await page.evaluate(()=>document.fonts.ready);\nawait page.evaluate(({mode,fields})=>{const imgs=[...document.images];imgs.forEach((img,i)=>{const f=fields[i];if(mode.includes('compositor'))img.style.transform='translateZ(0)';if(mode==='exact-size'){img.style.width=f.width+'px';img.style.height=f.height+'px';}if(mode==='source-position'||mode==='rounded-position'||mode==='natural-source-position'){img.style.position='absolute';img.style.left=(mode==='rounded-position'?Math.round(f.x):f.x)+'px';img.style.top=(mode==='rounded-position'?Math.round(f.y):f.y)+'px';}if(mode.startsWith('natural')){img.style.objectFit='none';img.style.objectPosition='left top';}if(mode.includes('svg')){const r=img.getBoundingClientRect();const svg=document.createElementNS('http://www.w3.org/2000/svg','svg');svg.style.cssText='position:absolute;left:'+r.x+'px;top:'+r.y+'px;width:'+r.width+'px;height:'+r.height+'px;overflow:hidden';const si=document.createElementNS('http://www.w3.org/2000/svg','image');si.setAttribute('href',img.src);si.setAttribute('width',mode.startsWith('natural')?img.naturalWidth:r.width);si.setAttribute('height',mode.startsWith('natural')?img.naturalHeight:r.height);si.setAttribute('preserveAspectRatio','none');svg.append(si);document.body.append(svg);img.style.visibility='hidden';}});}, {mode,fields});\nconst boxes=await page.evaluate(()=>({grid:(()=>{let e=document.querySelector('#root>div'),s=getComputedStyle(e),r=e.getBoundingClientRect();return {width:r.width,height:r.height,cols:s.gridTemplateColumns,rows:s.gridTemplateRows};})(),imgs:[...document.images].map(img=>{let r=img.getBoundingClientRect();return {src:img.getAttribute('src'),x:r.x,y:r.y,w:r.width,h:r.height,nw:img.naturalWidth,nh:img.naturalHeight};})}));\nconst bytes=await page.screenshot({omitBackground:true});writeFileSync(`out/w24-probe-${mode}.png`,bytes);results[mode]={...metric(PNG.sync.read(bytes)),...boxes};\nawait page.setViewportSize({width:64,height:64});\nawait page.goto('http://localhost:4276/?screen=keyframes-458-2021',{waitUntil:'networkidle'});await page.waitForSelector('body[data-ready=\"1\"]');\nconst kp=flatten(PNG.sync.read(await page.screenshot({omitBackground:true}))),kr=flatten(PNG.sync.read(readFileSync('out/keyframes-458-2021.reference.png')));let kc=0;for(let i=0;iMath.abs(kp.data[i+c]-kr.data[i+c])>24))kc++;\nresults[mode].keyframesChanged=kc;await page.setViewportSize({width:1281,height:1086});\n}\n}finally{await browser.close();spawnSync('taskkill',['/PID',String(preview.pid),'/T','/F']);}\nfor(let i=0;iMath.abs(img.data[a+c]-reference.data[b+c])>24))count++;}results.baseline.imgs[i].exportAtRoundedOriginChanged=count;}\nwriteFileSync('out/w24-grid-probes.json',JSON.stringify(results,null,2));console.log(JSON.stringify(results,null,2));\n\n", + "pixelAnalysisScript": "import json, math\nfrom pathlib import Path\nimport numpy as np\nfrom PIL import Image\n\ndef rgb(path):\n a=np.array(Image.open(path).convert('RGBA')).astype(float)\n return np.rint(a[:,:,:3]*a[:,:,3:4]/255+30*(1-a[:,:,3:4]/255))\n\nroot=Path('out')\nref=rgb(root/'grid-429-1966.reference.png')\nbaseline=rgb(root/'w24-baseline-grid.png')\nnodes=json.loads((root/'grid-429-1966-429-1966.snapshot.json').read_text())['nodes']\nprobes=json.loads((root/'w24-grid-probes.json').read_text())\nresult=[]\nfor node,img in zip(list(nodes.values())[1:],probes['baseline']['imgs']):\n f=node['fields']; source=rgb('public'+img['src']); h,w=source.shape[:2]\n x,y=round(f['x']),round(f['y']); target=ref[y:y+h,x:x+w]\n shifts=[]\n # Interior only: isolate sampling phase from boundary clipping.\n yy,xx=np.mgrid[2:h-2,2:w-2]; wanted=target[2:h-2,2:w-2]\n for dx in [-1,-2/3,-1/3,0,1/3,2/3,1]:\n for dy in [-1/3,0,1/3]:\n sx=xx-dx;sy=yy-dy;ix=np.floor(sx).astype(int);iy=np.floor(sy).astype(int);ax=(sx-ix)[...,None];ay=(sy-iy)[...,None]\n sampled=source[iy,ix]*(1-ax)*(1-ay)+source[iy,ix+1]*ax*(1-ay)+source[iy+1,ix]*(1-ax)*ay+source[iy+1,ix+1]*ax*ay\n count=int(np.any(np.abs(np.rint(sampled)-wanted)>24,axis=2).sum())\n shifts.append({'dx':dx,'dy':dy,'changedInterior':count})\n result.append({'id':node['id'],'source':f,'exportSize':[w,h],'naturalAtRoundedOrigin':int(np.any(abs(source-target)>24,axis=2).sum()),'bestInteriorShifts':sorted(shifts,key=lambda e:e['changedInterior'])[:5]})\nbands=[]\nmask=np.any(abs(baseline-ref)>24,axis=2)\nfor y in range(0,1086,100): bands.append({'y':y,'bottom':min(y+100,1086),'changedPixels':int(mask[y:y+100].sum())})\noutput={'images':result,'bands':bands}\n(root/'w24-grid-pixels.json').write_text(json.dumps(output,indent=2))\nprint(json.dumps({'images':[{k:v for k,v in e.items() if k!='source'} for e in result],'bands':bands},indent=2))\n" + }, + "densityExportAttempt": { + "scale": 2, + "nodeIds": [ + "429:1970", + "429:1971", + "429:1972" + ], + "result": "No response or exported files after more than five minutes; exploratory Python and own server stopped", + "isMeasurement": false + }, + "finalUnchangedRun": [ + { + "name": "grid-429-1966", + "frame": "429:1966", + "viewport": { + "width": 1281, + "height": 1086 + }, + "reference": "out/grid-429-1966.reference.png", + "actual": "out/grid-429-1966.actual.png", + "acquisition": { + "binarySha256": "27ca7e30f7fea3f1e76fe6e5049e46d1b5461d2b461a7bf8d7e0fef864c831c7", + "server": { + "version": "0.4.6", + "buildId": "937313e39448", + "commit": "937313e39448", + "displayVersion": "0.4.6+937313e39448", + "identityGuidance": "Identify deployments by commit/buildId, not version alone. If the expected commit/buildId differs, reconnect or restart the client MCP server connection after updating the binary.", + "updateAvailable": { + "current": "0.4.6", + "state": "unknown", + "note": "The newest release is not known: the check has not run yet, or it could not reach the network. This is an absent answer, not a failure, and it never delays a call." + } + }, + "responsePath": "out/grid-429-1966-429-1966.response.json", + "files": { + "src/screens/grid-429-1966.tsx": "6b16b8f79f4ecf590a24a1c13af67b488afc08a2d513d156e000c20728c1b0d2", + "themes/grid-429-1966.json": "a1a8437993a02c99489dfdc71ca7e2f5d6447f4956600fd939272816bc0f3f63", + "out/grid-429-1966.reference.png": "251925cfa907bcb24ff2077cbf81a778a0be9a9df62a9532359bea231f468e10", + "out/grid-429-1966-429-1966.snapshot.json": "9de5a06b83300efc89c2b02b21f0b7af0f71326accac1ad9dfe62a88c3bd6c02", + "public/images/Frame-506-429-1967-986461bdbd3b.png": "8722fc62d4e2e2395697bad982d1d28d159d10b15b0d38b09535e78232ea4ed6", + "public/images/Frame-508-429-1968-c886d36997c5.png": "7f8167a9cd5504e7a5e3a386993e6b6eb1dbd21753a86b940ecd4084c65983b7", + "public/images/Frame-509-429-1969-a6034b24119a.png": "e13b27fae8519c989ccda979e02377c63ed659b6105ce2263f227bae789bb1b8", + "public/images/Frame-507-429-1970-021ef10975df.png": "1fd831e6b6aab7c067a2d57fb06d42738fffe7bdf69c3ffbe9cd89fc1d9a9746", + "public/images/Frame-510-429-1971-40e88a5fbe9d.png": "83b2e86d2e4017e1a0996b56d76162ed2de8d6002918fb30aa1b4b083a33cc61", + "public/images/Frame-511-429-1972-f549097083e6.png": "d005a60f6b3f5d904c8f41f6fca683179e549e8416cee9fec6819e25e6d9d3d7" + } + }, + "themeHash": "a1a8437993a02c99489dfdc71ca7e2f5d6447f4956600fd939272816bc0f3f63", + "rendered": { + "width": 1281, + "height": 1086 + }, + "flattened": { + "canvas": [ + 30, + 30, + 30 + ], + "alpha": 0 + }, + "environmentStatus": "valid", + "compare": { + "exit": 1, + "stdout": "{\"status\":\"mismatch\",\"referenceDimensions\":[1281,1086],\"actualDimensions\":[1281,1086],\"changedPixels\":41234,\"totalPixels\":1391166,\"changedRatio\":0.029639884816046395,\"maxChangedRatio\":0.005,\"channelTolerance\":24,\"maxChannelDelta\":176,\"diffPath\":\"C:\\\\Users\\\\owjs3\\\\orca\\\\workspaces\\\\devup-mcp\\\\W24-C-grid\\\\harness\\\\render\\\\out\\\\grid-429-1966.diff.png\"}", + "stderr": "" + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 1281, + 1086 + ], + "actualDimensions": [ + 1281, + 1086 + ], + "changedPixels": 41234, + "totalPixels": 1391166, + "changedRatio": 0.029639884816046395, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 176, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W24-C-grid\\harness\\render\\out\\grid-429-1966.diff.png" + } + }, + { + "name": "keyframes-458-2021", + "frame": "458:2021", + "viewport": { + "width": 64, + "height": 64 + }, + "reference": "out/keyframes-458-2021.reference.png", + "actual": "out/keyframes-458-2021.actual.png", + "acquisition": { + "binarySha256": "27ca7e30f7fea3f1e76fe6e5049e46d1b5461d2b461a7bf8d7e0fef864c831c7", + "server": { + "version": "0.4.6", + "buildId": "937313e39448", + "commit": "937313e39448", + "displayVersion": "0.4.6+937313e39448", + "identityGuidance": "Identify deployments by commit/buildId, not version alone. If the expected commit/buildId differs, reconnect or restart the client MCP server connection after updating the binary.", + "updateAvailable": { + "current": "0.4.6", + "state": "unknown", + "note": "The newest release is not known: the check has not run yet, or it could not reach the network. This is an absent answer, not a failure, and it never delays a call." + } + }, + "responsePath": "out/keyframes-458-2021-458-2021.response.json", + "files": { + "src/screens/keyframes-458-2021.tsx": "f9e4d334a007caf23cc45575ea1a93a33b3b90abb5b8bc416952745072c6a935", + "themes/keyframes-458-2021.json": "a1a8437993a02c99489dfdc71ca7e2f5d6447f4956600fd939272816bc0f3f63", + "out/keyframes-458-2021.reference.png": "94ff08ecd5dac40feeb9ba154e40f0f527dbcaa31c02f5cbf0c03dae25ede191", + "out/keyframes-458-2021-458-2021.snapshot.json": "8ae3430b3818eabbdaae857264cdc505a5fbed16831041e2e747d4a1f3a66d0d" + } + }, + "themeHash": "a1a8437993a02c99489dfdc71ca7e2f5d6447f4956600fd939272816bc0f3f63", + "rendered": { + "width": 64, + "height": 64 + }, + "flattened": { + "canvas": [ + 30, + 30, + 30 + ], + "alpha": 0 + }, + "environmentStatus": "valid", + "compare": { + "exit": 1, + "stdout": "{\"status\":\"mismatch\",\"referenceDimensions\":[64,64],\"actualDimensions\":[64,64],\"changedPixels\":110,\"totalPixels\":4096,\"changedRatio\":0.02685546875,\"maxChangedRatio\":0.005,\"channelTolerance\":24,\"maxChannelDelta\":182,\"diffPath\":\"C:\\\\Users\\\\owjs3\\\\orca\\\\workspaces\\\\devup-mcp\\\\W24-C-grid\\\\harness\\\\render\\\\out\\\\keyframes-458-2021.diff.png\"}", + "stderr": "" + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 64, + 64 + ], + "actualDimensions": [ + 64, + 64 + ], + "changedPixels": 110, + "totalPixels": 4096, + "changedRatio": 0.02685546875, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 182, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W24-C-grid\\harness\\render\\out\\keyframes-458-2021.diff.png" + } + } + ], + "finalPngsByteIdenticalToBaseline": true, + "gates": { + "fmt": { + "exit": 0 + }, + "clippy": { + "exit": 0, + "warnings": 0 + }, + "workspace": { + "exit": 0, + "passed": 1112, + "failed": 0, + "ignored": 2 + }, + "insta": { + "exit": 0, + "passed": 1112, + "failed": 0, + "ignored": 2, + "pendingSnapshots": 0 + }, + "smoke": { + "exit": 0, + "passed": 2, + "failed": 0 + } + }, + "gateLogHashes": { + "fmt": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "clippy": "342b704f8833d07592c2447ecc7d606c3436c888afa4beba603d195885fb9c24", + "workspace": "916d09cc15389f709cbae052f8e55ea73951d72ffb75cc9227caf1436860e82f", + "insta": "6c81edfb0f240654302cc3f7579afc3f220499ed591bbc7897885bac884d69cb", + "smoke": "04a8c7c38e22a995c45e9fa8055a89caf321202d9f22000b014363aaca4d542e" + } +} From 5190f0ba6eff3f866c496468de84a8ea190490db Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 14 Sep 2026 01:16:21 +0900 Subject: [PATCH 2/5] fix: keep responsive child image sources scalar --- .../src/codegen/responsive.rs | 22 +- .../tests/responsive_image_sources.rs | 84 + docs/popup-image-sources-evidence.json | 2949 +++++++++++++++++ docs/popup-image-sources.md | 196 ++ harness/render/thresholds.json | 6 +- 5 files changed, 3253 insertions(+), 4 deletions(-) create mode 100644 crates/devup-mcp-devup-ui/tests/responsive_image_sources.rs create mode 100644 docs/popup-image-sources-evidence.json create mode 100644 docs/popup-image-sources.md diff --git a/crates/devup-mcp-devup-ui/src/codegen/responsive.rs b/crates/devup-mcp-devup-ui/src/codegen/responsive.rs index d7ce137..479fc31 100644 --- a/crates/devup-mcp-devup-ui/src/codegen/responsive.rs +++ b/crates/devup-mcp-devup-ui/src/codegen/responsive.rs @@ -561,11 +561,19 @@ fn children_to_map(tree: &Tree) -> Vec<(String, Vec<&Tree>)> { let mut grouped: Vec<(String, Vec<&Tree>)> = Vec::new(); for child in &tree.children { let signature = structure_signature(child); - let key = if counts.get(&signature) == Some(&1) { + let mut key = if counts.get(&signature) == Some(&1) { format!("sig:{signature}") } else { child.node_name.clone() }; + // `src` is an HTML attribute, not a responsive CSS property. Keep + // distinct sources as distinct children; the existing missing-child + // merge supplies their visibility slots without array-valued URLs. + if child.component == "Image" + && let Some(source) = child.props.get("src") + { + key = serde_json::to_string(&(key, source)).expect("image identity is serializable"); + } if let Some((_, bucket)) = grouped.iter_mut().find(|(existing, _)| *existing == key) { bucket.push(child); } else { @@ -1033,6 +1041,18 @@ fn merge_children( let mut children: BySlot = std::array::from_fn(|slot| { bucket(slot).and_then(|list| list.get(index).cloned().cloned()) }); + if (0..SLOTS).any(|slot| by_slot[slot].is_some() && children[slot].is_none()) { + for child in children.iter_mut().flatten() { + if child.component == "Image" { + // A present source must restore visibility even when + // it is absent on both sides of this drawn slot. + child + .props + .entry("display".to_owned()) + .or_insert_with(|| natural_display("Image").to_owned()); + } + } + } // A width that does not draw this child is given a copy of the // first one that does — first in the Section's order — hidden. The // copies then merge like anything else: the `display` array falls diff --git a/crates/devup-mcp-devup-ui/tests/responsive_image_sources.rs b/crates/devup-mcp-devup-ui/tests/responsive_image_sources.rs new file mode 100644 index 0000000..65a6008 --- /dev/null +++ b/crates/devup-mcp-devup-ui/tests/responsive_image_sources.rs @@ -0,0 +1,84 @@ +use devup_mcp_devup_ui::codegen::{CodegenOptions, responsive::merge_breakpoints}; +use devup_mcp_figma::Snapshot; +use serde_json::json; + +fn screen(widths: [u32; 3], names: [&str; 3]) -> String { + let mut nodes = serde_json::Map::new(); + let mut roots = Vec::new(); + for (index, (width, name)) in widths.into_iter().zip(names).enumerate() { + let root = format!("frame:{index}"); + let image = format!("asset:{index}"); + let text = format!("text:{index}"); + roots.push(root.clone()); + nodes.insert( + root.clone(), + json!({"id":root,"type":"FRAME","fields":{ + "name":(["mobile","tablet","desktop"][index]),"width":width,"height":200, + "layoutMode":"HORIZONTAL","layoutSizingHorizontal":"FIXED", + "layoutSizingVertical":"FIXED","childrenIds":[image,text] + }}), + ); + nodes.insert( + image.clone(), + json!({"id":image,"type":"RECTANGLE","fields":{ + "name":name,"parentId":root,"width":24,"height":24,"isAsset":true, + "layoutSizingHorizontal":"FIXED","layoutSizingVertical":"FIXED", + "fills":[{"type":"IMAGE","visible":true,"scaleMode":"FILL","imageHash":name}] + }}), + ); + nodes.insert( + text.clone(), + json!({"id":text,"type":"TEXT","fields":{ + "name":"label","parentId":root,"characters":"label","fontSize":14, + "lineHeight":{"unit":"PIXELS","value":20},"width":40,"height":20 + }}), + ); + } + let snapshot: Snapshot = serde_json::from_value(json!({ + "fileKey":"images","version":null,"roots":roots,"nodes":nodes,"diagnostics":[] + })) + .unwrap(); + merge_breakpoints(&snapshot, &CodegenOptions::default()) + .unwrap() + .unwrap() + .tsx +} + +#[test] +fn different_image_sources_stay_scalar_through_responsive_merging() { + for widths in [[320, 700, 1600], [450, 900, 1400]] { + let tsx = screen(widths, ["first", "second", "third"]); + assert!( + !tsx.contains("src={["), + "HTML src cannot receive a CSS array: {tsx}" + ); + for name in ["first", "second", "third"] { + assert!( + tsx.contains(&format!("src=\"/images/{name}.png\"")), + "{tsx}" + ); + } + assert_eq!(tsx.matches("(); + assert!( + compact.contains("display={[\"inline\",\"none\",null,null,\"inline\"]}"), + "{tsx}" + ); + assert!(!tsx.contains("src={["), "{tsx}"); +} diff --git a/docs/popup-image-sources-evidence.json b/docs/popup-image-sources-evidence.json new file mode 100644 index 0000000..60af124 --- /dev/null +++ b/docs/popup-image-sources-evidence.json @@ -0,0 +1,2949 @@ +{ + "baseCommit": "937313e39448db7f7c05dbb0ab206432261b2203", + "baselineBinarySha256": "0ae51b1421d38fe3ca7c7cf079e1f6a28e39f1e77d9e9e5784178df5a47155ab", + "candidateBinarySha256": "eb54a7c9c6e2517ef4308b8376915d04d37b475a16b01c91f6921ccee84304bb", + "baselines": [ + [ + { + "name": "popup-422-5682", + "environmentStatus": "valid", + "viewport": { + "width": 390, + "height": 800 + }, + "rendered": { + "width": 390, + "height": 800 + }, + "themeHash": "d541f2ae904988f388a0dc3a0aeed6922924ad181e5d0fe266964deedf62e9ae", + "binarySha256": "0ae51b1421d38fe3ca7c7cf079e1f6a28e39f1e77d9e9e5784178df5a47155ab", + "inputHashes": { + "src/screens/popup.tsx": "413fa6750729f3fe1c66ca7fc5d149e94bfb73a4d5d6f176b43bff6a467450e7", + "themes/popup.json": "d541f2ae904988f388a0dc3a0aeed6922924ad181e5d0fe266964deedf62e9ae", + "out/popup-422-5682.reference.png": "b70f8364a24570367868ce0e52c9f64643640a9e5dad9aa589d67633e7fcc155", + "out/popup-422-5682.snapshot.json": "da2033d27ab05dc0c5f7c562c2308d9c2b427301c9637f50a0e0cee13fb6647e", + "public/icons/megaphone_760116-1-422-5687-ddd0aee2dd3c.svg": "5e220d91215a0b70752a999e2c4e6da0341eea9554c089a9437eaf13c0a1110b", + "public/icons/Frame-1000013807-422-5702-437ef34c2c83.svg": "8066276cd79544ea1b6337c27a3dfb81ed9fa1dace8c2447d181d92e3fd76fcf", + "public/icons/megaphone_760116-1-422-5710-9f758e0f819d.svg": "43fd7a092ba75f5efd858484f07d9ae7169fa044f674fbf7213743b853b4ad4d", + "public/icons/Frame-1000013807-422-5725-ee6d994851a6.svg": "8066276cd79544ea1b6337c27a3dfb81ed9fa1dace8c2447d181d92e3fd76fcf", + "public/icons/megaphone_760116-1-422-5733-f0074be50750.svg": "43fd7a092ba75f5efd858484f07d9ae7169fa044f674fbf7213743b853b4ad4d", + "public/icons/Frame-1000013807-422-5748-ae2fb3748882.svg": "05f5307c63820132c4c6026ba941bc955c83c38d6c16f249bea0cea7982b4220" + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 390, + 800 + ], + "actualDimensions": [ + 390, + 800 + ], + "changedPixels": 11370, + "totalPixels": 312000, + "changedRatio": 0.03644230769230769, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 236, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W24-B-popup\\harness\\render\\out\\popup-422-5682.diff.png" + } + }, + { + "name": "popup-422-5705", + "environmentStatus": "valid", + "viewport": { + "width": 768, + "height": 1024 + }, + "rendered": { + "width": 768, + "height": 1024 + }, + "themeHash": "d541f2ae904988f388a0dc3a0aeed6922924ad181e5d0fe266964deedf62e9ae", + "binarySha256": "0ae51b1421d38fe3ca7c7cf079e1f6a28e39f1e77d9e9e5784178df5a47155ab", + "inputHashes": { + "src/screens/popup.tsx": "413fa6750729f3fe1c66ca7fc5d149e94bfb73a4d5d6f176b43bff6a467450e7", + "themes/popup.json": "d541f2ae904988f388a0dc3a0aeed6922924ad181e5d0fe266964deedf62e9ae", + "out/popup-422-5705.reference.png": "c4e30d646e39234ef40f09e8e196baf2d3e72addbc4271d0b069193f8f0dc4ad", + "out/popup-422-5705.snapshot.json": "da2033d27ab05dc0c5f7c562c2308d9c2b427301c9637f50a0e0cee13fb6647e", + "public/icons/megaphone_760116-1-422-5687-ddd0aee2dd3c.svg": "5e220d91215a0b70752a999e2c4e6da0341eea9554c089a9437eaf13c0a1110b", + "public/icons/Frame-1000013807-422-5702-437ef34c2c83.svg": "8066276cd79544ea1b6337c27a3dfb81ed9fa1dace8c2447d181d92e3fd76fcf", + "public/icons/megaphone_760116-1-422-5710-9f758e0f819d.svg": "43fd7a092ba75f5efd858484f07d9ae7169fa044f674fbf7213743b853b4ad4d", + "public/icons/Frame-1000013807-422-5725-ee6d994851a6.svg": "8066276cd79544ea1b6337c27a3dfb81ed9fa1dace8c2447d181d92e3fd76fcf", + "public/icons/megaphone_760116-1-422-5733-f0074be50750.svg": "43fd7a092ba75f5efd858484f07d9ae7169fa044f674fbf7213743b853b4ad4d", + "public/icons/Frame-1000013807-422-5748-ae2fb3748882.svg": "05f5307c63820132c4c6026ba941bc955c83c38d6c16f249bea0cea7982b4220" + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 768, + 1024 + ], + "actualDimensions": [ + 768, + 1024 + ], + "changedPixels": 16221, + "totalPixels": 786432, + "changedRatio": 0.020626068115234375, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 236, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W24-B-popup\\harness\\render\\out\\popup-422-5705.diff.png" + } + }, + { + "name": "popup-422-5728", + "environmentStatus": "valid", + "viewport": { + "width": 1920, + "height": 1080 + }, + "rendered": { + "width": 1920, + "height": 1080 + }, + "themeHash": "d541f2ae904988f388a0dc3a0aeed6922924ad181e5d0fe266964deedf62e9ae", + "binarySha256": "0ae51b1421d38fe3ca7c7cf079e1f6a28e39f1e77d9e9e5784178df5a47155ab", + "inputHashes": { + "src/screens/popup.tsx": "413fa6750729f3fe1c66ca7fc5d149e94bfb73a4d5d6f176b43bff6a467450e7", + "themes/popup.json": "d541f2ae904988f388a0dc3a0aeed6922924ad181e5d0fe266964deedf62e9ae", + "out/popup-422-5728.reference.png": "82ab13e4a18136875449cae8e1d34c13bbe0e74350e249d2674ec45dfad86444", + "out/popup-422-5728.snapshot.json": "da2033d27ab05dc0c5f7c562c2308d9c2b427301c9637f50a0e0cee13fb6647e", + "public/icons/megaphone_760116-1-422-5687-ddd0aee2dd3c.svg": "5e220d91215a0b70752a999e2c4e6da0341eea9554c089a9437eaf13c0a1110b", + "public/icons/Frame-1000013807-422-5702-437ef34c2c83.svg": "8066276cd79544ea1b6337c27a3dfb81ed9fa1dace8c2447d181d92e3fd76fcf", + "public/icons/megaphone_760116-1-422-5710-9f758e0f819d.svg": "43fd7a092ba75f5efd858484f07d9ae7169fa044f674fbf7213743b853b4ad4d", + "public/icons/Frame-1000013807-422-5725-ee6d994851a6.svg": "8066276cd79544ea1b6337c27a3dfb81ed9fa1dace8c2447d181d92e3fd76fcf", + "public/icons/megaphone_760116-1-422-5733-f0074be50750.svg": "43fd7a092ba75f5efd858484f07d9ae7169fa044f674fbf7213743b853b4ad4d", + "public/icons/Frame-1000013807-422-5748-ae2fb3748882.svg": "05f5307c63820132c4c6026ba941bc955c83c38d6c16f249bea0cea7982b4220" + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 1920, + 1080 + ], + "actualDimensions": [ + 1920, + 1080 + ], + "changedPixels": 17699, + "totalPixels": 2073600, + "changedRatio": 0.00853539737654321, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 237, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W24-B-popup\\harness\\render\\out\\popup-422-5728.diff.png" + } + } + ], + [ + { + "name": "popup-422-5682", + "environmentStatus": "valid", + "viewport": { + "width": 390, + "height": 800 + }, + "rendered": { + "width": 390, + "height": 800 + }, + "themeHash": "d541f2ae904988f388a0dc3a0aeed6922924ad181e5d0fe266964deedf62e9ae", + "binarySha256": "0ae51b1421d38fe3ca7c7cf079e1f6a28e39f1e77d9e9e5784178df5a47155ab", + "inputHashes": { + "src/screens/popup.tsx": "413fa6750729f3fe1c66ca7fc5d149e94bfb73a4d5d6f176b43bff6a467450e7", + "themes/popup.json": "d541f2ae904988f388a0dc3a0aeed6922924ad181e5d0fe266964deedf62e9ae", + "out/popup-422-5682.reference.png": "b70f8364a24570367868ce0e52c9f64643640a9e5dad9aa589d67633e7fcc155", + "out/popup-422-5682.snapshot.json": "da2033d27ab05dc0c5f7c562c2308d9c2b427301c9637f50a0e0cee13fb6647e", + "public/icons/megaphone_760116-1-422-5687-ddd0aee2dd3c.svg": "5e220d91215a0b70752a999e2c4e6da0341eea9554c089a9437eaf13c0a1110b", + "public/icons/Frame-1000013807-422-5702-437ef34c2c83.svg": "8066276cd79544ea1b6337c27a3dfb81ed9fa1dace8c2447d181d92e3fd76fcf", + "public/icons/megaphone_760116-1-422-5710-9f758e0f819d.svg": "43fd7a092ba75f5efd858484f07d9ae7169fa044f674fbf7213743b853b4ad4d", + "public/icons/Frame-1000013807-422-5725-ee6d994851a6.svg": "8066276cd79544ea1b6337c27a3dfb81ed9fa1dace8c2447d181d92e3fd76fcf", + "public/icons/megaphone_760116-1-422-5733-f0074be50750.svg": "43fd7a092ba75f5efd858484f07d9ae7169fa044f674fbf7213743b853b4ad4d", + "public/icons/Frame-1000013807-422-5748-ae2fb3748882.svg": "05f5307c63820132c4c6026ba941bc955c83c38d6c16f249bea0cea7982b4220" + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 390, + 800 + ], + "actualDimensions": [ + 390, + 800 + ], + "changedPixels": 11370, + "totalPixels": 312000, + "changedRatio": 0.03644230769230769, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 236, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W24-B-popup\\harness\\render\\out\\popup-422-5682.diff.png" + } + }, + { + "name": "popup-422-5705", + "environmentStatus": "valid", + "viewport": { + "width": 768, + "height": 1024 + }, + "rendered": { + "width": 768, + "height": 1024 + }, + "themeHash": "d541f2ae904988f388a0dc3a0aeed6922924ad181e5d0fe266964deedf62e9ae", + "binarySha256": "0ae51b1421d38fe3ca7c7cf079e1f6a28e39f1e77d9e9e5784178df5a47155ab", + "inputHashes": { + "src/screens/popup.tsx": "413fa6750729f3fe1c66ca7fc5d149e94bfb73a4d5d6f176b43bff6a467450e7", + "themes/popup.json": "d541f2ae904988f388a0dc3a0aeed6922924ad181e5d0fe266964deedf62e9ae", + "out/popup-422-5705.reference.png": "c4e30d646e39234ef40f09e8e196baf2d3e72addbc4271d0b069193f8f0dc4ad", + "out/popup-422-5705.snapshot.json": "da2033d27ab05dc0c5f7c562c2308d9c2b427301c9637f50a0e0cee13fb6647e", + "public/icons/megaphone_760116-1-422-5687-ddd0aee2dd3c.svg": "5e220d91215a0b70752a999e2c4e6da0341eea9554c089a9437eaf13c0a1110b", + "public/icons/Frame-1000013807-422-5702-437ef34c2c83.svg": "8066276cd79544ea1b6337c27a3dfb81ed9fa1dace8c2447d181d92e3fd76fcf", + "public/icons/megaphone_760116-1-422-5710-9f758e0f819d.svg": "43fd7a092ba75f5efd858484f07d9ae7169fa044f674fbf7213743b853b4ad4d", + "public/icons/Frame-1000013807-422-5725-ee6d994851a6.svg": "8066276cd79544ea1b6337c27a3dfb81ed9fa1dace8c2447d181d92e3fd76fcf", + "public/icons/megaphone_760116-1-422-5733-f0074be50750.svg": "43fd7a092ba75f5efd858484f07d9ae7169fa044f674fbf7213743b853b4ad4d", + "public/icons/Frame-1000013807-422-5748-ae2fb3748882.svg": "05f5307c63820132c4c6026ba941bc955c83c38d6c16f249bea0cea7982b4220" + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 768, + 1024 + ], + "actualDimensions": [ + 768, + 1024 + ], + "changedPixels": 16221, + "totalPixels": 786432, + "changedRatio": 0.020626068115234375, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 236, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W24-B-popup\\harness\\render\\out\\popup-422-5705.diff.png" + } + }, + { + "name": "popup-422-5728", + "environmentStatus": "valid", + "viewport": { + "width": 1920, + "height": 1080 + }, + "rendered": { + "width": 1920, + "height": 1080 + }, + "themeHash": "d541f2ae904988f388a0dc3a0aeed6922924ad181e5d0fe266964deedf62e9ae", + "binarySha256": "0ae51b1421d38fe3ca7c7cf079e1f6a28e39f1e77d9e9e5784178df5a47155ab", + "inputHashes": { + "src/screens/popup.tsx": "413fa6750729f3fe1c66ca7fc5d149e94bfb73a4d5d6f176b43bff6a467450e7", + "themes/popup.json": "d541f2ae904988f388a0dc3a0aeed6922924ad181e5d0fe266964deedf62e9ae", + "out/popup-422-5728.reference.png": "82ab13e4a18136875449cae8e1d34c13bbe0e74350e249d2674ec45dfad86444", + "out/popup-422-5728.snapshot.json": "da2033d27ab05dc0c5f7c562c2308d9c2b427301c9637f50a0e0cee13fb6647e", + "public/icons/megaphone_760116-1-422-5687-ddd0aee2dd3c.svg": "5e220d91215a0b70752a999e2c4e6da0341eea9554c089a9437eaf13c0a1110b", + "public/icons/Frame-1000013807-422-5702-437ef34c2c83.svg": "8066276cd79544ea1b6337c27a3dfb81ed9fa1dace8c2447d181d92e3fd76fcf", + "public/icons/megaphone_760116-1-422-5710-9f758e0f819d.svg": "43fd7a092ba75f5efd858484f07d9ae7169fa044f674fbf7213743b853b4ad4d", + "public/icons/Frame-1000013807-422-5725-ee6d994851a6.svg": "8066276cd79544ea1b6337c27a3dfb81ed9fa1dace8c2447d181d92e3fd76fcf", + "public/icons/megaphone_760116-1-422-5733-f0074be50750.svg": "43fd7a092ba75f5efd858484f07d9ae7169fa044f674fbf7213743b853b4ad4d", + "public/icons/Frame-1000013807-422-5748-ae2fb3748882.svg": "05f5307c63820132c4c6026ba941bc955c83c38d6c16f249bea0cea7982b4220" + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 1920, + 1080 + ], + "actualDimensions": [ + 1920, + 1080 + ], + "changedPixels": 17699, + "totalPixels": 2073600, + "changedRatio": 0.00853539737654321, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 237, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W24-B-popup\\harness\\render\\out\\popup-422-5728.diff.png" + } + } + ] + ], + "candidates": [ + [ + { + "name": "popup-422-5682", + "environmentStatus": "valid", + "viewport": { + "width": 390, + "height": 800 + }, + "rendered": { + "width": 390, + "height": 800 + }, + "themeHash": "d541f2ae904988f388a0dc3a0aeed6922924ad181e5d0fe266964deedf62e9ae", + "binarySha256": "eb54a7c9c6e2517ef4308b8376915d04d37b475a16b01c91f6921ccee84304bb", + "inputHashes": { + "src/screens/popup.tsx": "1cc9271ad5ef2859438b45415ea5361efac816c73f6105860b0564ab4bc5e5e8", + "themes/popup.json": "d541f2ae904988f388a0dc3a0aeed6922924ad181e5d0fe266964deedf62e9ae", + "out/popup-422-5682.reference.png": "b70f8364a24570367868ce0e52c9f64643640a9e5dad9aa589d67633e7fcc155", + "out/popup-422-5682.snapshot.json": "da2033d27ab05dc0c5f7c562c2308d9c2b427301c9637f50a0e0cee13fb6647e", + "public/icons/megaphone_760116-1-422-5687-ddd0aee2dd3c.svg": "5e220d91215a0b70752a999e2c4e6da0341eea9554c089a9437eaf13c0a1110b", + "public/icons/Frame-1000013807-422-5702-437ef34c2c83.svg": "8066276cd79544ea1b6337c27a3dfb81ed9fa1dace8c2447d181d92e3fd76fcf", + "public/icons/megaphone_760116-1-422-5710-9f758e0f819d.svg": "43fd7a092ba75f5efd858484f07d9ae7169fa044f674fbf7213743b853b4ad4d", + "public/icons/Frame-1000013807-422-5725-ee6d994851a6.svg": "8066276cd79544ea1b6337c27a3dfb81ed9fa1dace8c2447d181d92e3fd76fcf", + "public/icons/megaphone_760116-1-422-5733-f0074be50750.svg": "43fd7a092ba75f5efd858484f07d9ae7169fa044f674fbf7213743b853b4ad4d", + "public/icons/Frame-1000013807-422-5748-ae2fb3748882.svg": "05f5307c63820132c4c6026ba941bc955c83c38d6c16f249bea0cea7982b4220" + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 390, + 800 + ], + "actualDimensions": [ + 390, + 800 + ], + "changedPixels": 11155, + "totalPixels": 312000, + "changedRatio": 0.03575320512820513, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 236, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W24-B-popup\\harness\\render\\out\\popup-422-5682.diff.png" + } + }, + { + "name": "popup-422-5705", + "environmentStatus": "valid", + "viewport": { + "width": 768, + "height": 1024 + }, + "rendered": { + "width": 768, + "height": 1024 + }, + "themeHash": "d541f2ae904988f388a0dc3a0aeed6922924ad181e5d0fe266964deedf62e9ae", + "binarySha256": "eb54a7c9c6e2517ef4308b8376915d04d37b475a16b01c91f6921ccee84304bb", + "inputHashes": { + "src/screens/popup.tsx": "1cc9271ad5ef2859438b45415ea5361efac816c73f6105860b0564ab4bc5e5e8", + "themes/popup.json": "d541f2ae904988f388a0dc3a0aeed6922924ad181e5d0fe266964deedf62e9ae", + "out/popup-422-5705.reference.png": "c4e30d646e39234ef40f09e8e196baf2d3e72addbc4271d0b069193f8f0dc4ad", + "out/popup-422-5705.snapshot.json": "da2033d27ab05dc0c5f7c562c2308d9c2b427301c9637f50a0e0cee13fb6647e", + "public/icons/megaphone_760116-1-422-5687-ddd0aee2dd3c.svg": "5e220d91215a0b70752a999e2c4e6da0341eea9554c089a9437eaf13c0a1110b", + "public/icons/Frame-1000013807-422-5702-437ef34c2c83.svg": "8066276cd79544ea1b6337c27a3dfb81ed9fa1dace8c2447d181d92e3fd76fcf", + "public/icons/megaphone_760116-1-422-5710-9f758e0f819d.svg": "43fd7a092ba75f5efd858484f07d9ae7169fa044f674fbf7213743b853b4ad4d", + "public/icons/Frame-1000013807-422-5725-ee6d994851a6.svg": "8066276cd79544ea1b6337c27a3dfb81ed9fa1dace8c2447d181d92e3fd76fcf", + "public/icons/megaphone_760116-1-422-5733-f0074be50750.svg": "43fd7a092ba75f5efd858484f07d9ae7169fa044f674fbf7213743b853b4ad4d", + "public/icons/Frame-1000013807-422-5748-ae2fb3748882.svg": "05f5307c63820132c4c6026ba941bc955c83c38d6c16f249bea0cea7982b4220" + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 768, + 1024 + ], + "actualDimensions": [ + 768, + 1024 + ], + "changedPixels": 15893, + "totalPixels": 786432, + "changedRatio": 0.020208994547526043, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 236, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W24-B-popup\\harness\\render\\out\\popup-422-5705.diff.png" + } + }, + { + "name": "popup-422-5728", + "environmentStatus": "valid", + "viewport": { + "width": 1920, + "height": 1080 + }, + "rendered": { + "width": 1920, + "height": 1080 + }, + "themeHash": "d541f2ae904988f388a0dc3a0aeed6922924ad181e5d0fe266964deedf62e9ae", + "binarySha256": "eb54a7c9c6e2517ef4308b8376915d04d37b475a16b01c91f6921ccee84304bb", + "inputHashes": { + "src/screens/popup.tsx": "1cc9271ad5ef2859438b45415ea5361efac816c73f6105860b0564ab4bc5e5e8", + "themes/popup.json": "d541f2ae904988f388a0dc3a0aeed6922924ad181e5d0fe266964deedf62e9ae", + "out/popup-422-5728.reference.png": "82ab13e4a18136875449cae8e1d34c13bbe0e74350e249d2674ec45dfad86444", + "out/popup-422-5728.snapshot.json": "da2033d27ab05dc0c5f7c562c2308d9c2b427301c9637f50a0e0cee13fb6647e", + "public/icons/megaphone_760116-1-422-5687-ddd0aee2dd3c.svg": "5e220d91215a0b70752a999e2c4e6da0341eea9554c089a9437eaf13c0a1110b", + "public/icons/Frame-1000013807-422-5702-437ef34c2c83.svg": "8066276cd79544ea1b6337c27a3dfb81ed9fa1dace8c2447d181d92e3fd76fcf", + "public/icons/megaphone_760116-1-422-5710-9f758e0f819d.svg": "43fd7a092ba75f5efd858484f07d9ae7169fa044f674fbf7213743b853b4ad4d", + "public/icons/Frame-1000013807-422-5725-ee6d994851a6.svg": "8066276cd79544ea1b6337c27a3dfb81ed9fa1dace8c2447d181d92e3fd76fcf", + "public/icons/megaphone_760116-1-422-5733-f0074be50750.svg": "43fd7a092ba75f5efd858484f07d9ae7169fa044f674fbf7213743b853b4ad4d", + "public/icons/Frame-1000013807-422-5748-ae2fb3748882.svg": "05f5307c63820132c4c6026ba941bc955c83c38d6c16f249bea0cea7982b4220" + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 1920, + 1080 + ], + "actualDimensions": [ + 1920, + 1080 + ], + "changedPixels": 17371, + "totalPixels": 2073600, + "changedRatio": 0.00837721836419753, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 237, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W24-B-popup\\harness\\render\\out\\popup-422-5728.diff.png" + } + } + ], + [ + { + "name": "popup-422-5682", + "environmentStatus": "valid", + "viewport": { + "width": 390, + "height": 800 + }, + "rendered": { + "width": 390, + "height": 800 + }, + "themeHash": "d541f2ae904988f388a0dc3a0aeed6922924ad181e5d0fe266964deedf62e9ae", + "binarySha256": "eb54a7c9c6e2517ef4308b8376915d04d37b475a16b01c91f6921ccee84304bb", + "inputHashes": { + "src/screens/popup.tsx": "1cc9271ad5ef2859438b45415ea5361efac816c73f6105860b0564ab4bc5e5e8", + "themes/popup.json": "d541f2ae904988f388a0dc3a0aeed6922924ad181e5d0fe266964deedf62e9ae", + "out/popup-422-5682.reference.png": "b70f8364a24570367868ce0e52c9f64643640a9e5dad9aa589d67633e7fcc155", + "out/popup-422-5682.snapshot.json": "da2033d27ab05dc0c5f7c562c2308d9c2b427301c9637f50a0e0cee13fb6647e", + "public/icons/megaphone_760116-1-422-5687-ddd0aee2dd3c.svg": "5e220d91215a0b70752a999e2c4e6da0341eea9554c089a9437eaf13c0a1110b", + "public/icons/Frame-1000013807-422-5702-437ef34c2c83.svg": "8066276cd79544ea1b6337c27a3dfb81ed9fa1dace8c2447d181d92e3fd76fcf", + "public/icons/megaphone_760116-1-422-5710-9f758e0f819d.svg": "43fd7a092ba75f5efd858484f07d9ae7169fa044f674fbf7213743b853b4ad4d", + "public/icons/Frame-1000013807-422-5725-ee6d994851a6.svg": "8066276cd79544ea1b6337c27a3dfb81ed9fa1dace8c2447d181d92e3fd76fcf", + "public/icons/megaphone_760116-1-422-5733-f0074be50750.svg": "43fd7a092ba75f5efd858484f07d9ae7169fa044f674fbf7213743b853b4ad4d", + "public/icons/Frame-1000013807-422-5748-ae2fb3748882.svg": "05f5307c63820132c4c6026ba941bc955c83c38d6c16f249bea0cea7982b4220" + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 390, + 800 + ], + "actualDimensions": [ + 390, + 800 + ], + "changedPixels": 11155, + "totalPixels": 312000, + "changedRatio": 0.03575320512820513, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 236, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W24-B-popup\\harness\\render\\out\\popup-422-5682.diff.png" + } + }, + { + "name": "popup-422-5705", + "environmentStatus": "valid", + "viewport": { + "width": 768, + "height": 1024 + }, + "rendered": { + "width": 768, + "height": 1024 + }, + "themeHash": "d541f2ae904988f388a0dc3a0aeed6922924ad181e5d0fe266964deedf62e9ae", + "binarySha256": "eb54a7c9c6e2517ef4308b8376915d04d37b475a16b01c91f6921ccee84304bb", + "inputHashes": { + "src/screens/popup.tsx": "1cc9271ad5ef2859438b45415ea5361efac816c73f6105860b0564ab4bc5e5e8", + "themes/popup.json": "d541f2ae904988f388a0dc3a0aeed6922924ad181e5d0fe266964deedf62e9ae", + "out/popup-422-5705.reference.png": "c4e30d646e39234ef40f09e8e196baf2d3e72addbc4271d0b069193f8f0dc4ad", + "out/popup-422-5705.snapshot.json": "da2033d27ab05dc0c5f7c562c2308d9c2b427301c9637f50a0e0cee13fb6647e", + "public/icons/megaphone_760116-1-422-5687-ddd0aee2dd3c.svg": "5e220d91215a0b70752a999e2c4e6da0341eea9554c089a9437eaf13c0a1110b", + "public/icons/Frame-1000013807-422-5702-437ef34c2c83.svg": "8066276cd79544ea1b6337c27a3dfb81ed9fa1dace8c2447d181d92e3fd76fcf", + "public/icons/megaphone_760116-1-422-5710-9f758e0f819d.svg": "43fd7a092ba75f5efd858484f07d9ae7169fa044f674fbf7213743b853b4ad4d", + "public/icons/Frame-1000013807-422-5725-ee6d994851a6.svg": "8066276cd79544ea1b6337c27a3dfb81ed9fa1dace8c2447d181d92e3fd76fcf", + "public/icons/megaphone_760116-1-422-5733-f0074be50750.svg": "43fd7a092ba75f5efd858484f07d9ae7169fa044f674fbf7213743b853b4ad4d", + "public/icons/Frame-1000013807-422-5748-ae2fb3748882.svg": "05f5307c63820132c4c6026ba941bc955c83c38d6c16f249bea0cea7982b4220" + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 768, + 1024 + ], + "actualDimensions": [ + 768, + 1024 + ], + "changedPixels": 15893, + "totalPixels": 786432, + "changedRatio": 0.020208994547526043, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 236, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W24-B-popup\\harness\\render\\out\\popup-422-5705.diff.png" + } + }, + { + "name": "popup-422-5728", + "environmentStatus": "valid", + "viewport": { + "width": 1920, + "height": 1080 + }, + "rendered": { + "width": 1920, + "height": 1080 + }, + "themeHash": "d541f2ae904988f388a0dc3a0aeed6922924ad181e5d0fe266964deedf62e9ae", + "binarySha256": "eb54a7c9c6e2517ef4308b8376915d04d37b475a16b01c91f6921ccee84304bb", + "inputHashes": { + "src/screens/popup.tsx": "1cc9271ad5ef2859438b45415ea5361efac816c73f6105860b0564ab4bc5e5e8", + "themes/popup.json": "d541f2ae904988f388a0dc3a0aeed6922924ad181e5d0fe266964deedf62e9ae", + "out/popup-422-5728.reference.png": "82ab13e4a18136875449cae8e1d34c13bbe0e74350e249d2674ec45dfad86444", + "out/popup-422-5728.snapshot.json": "da2033d27ab05dc0c5f7c562c2308d9c2b427301c9637f50a0e0cee13fb6647e", + "public/icons/megaphone_760116-1-422-5687-ddd0aee2dd3c.svg": "5e220d91215a0b70752a999e2c4e6da0341eea9554c089a9437eaf13c0a1110b", + "public/icons/Frame-1000013807-422-5702-437ef34c2c83.svg": "8066276cd79544ea1b6337c27a3dfb81ed9fa1dace8c2447d181d92e3fd76fcf", + "public/icons/megaphone_760116-1-422-5710-9f758e0f819d.svg": "43fd7a092ba75f5efd858484f07d9ae7169fa044f674fbf7213743b853b4ad4d", + "public/icons/Frame-1000013807-422-5725-ee6d994851a6.svg": "8066276cd79544ea1b6337c27a3dfb81ed9fa1dace8c2447d181d92e3fd76fcf", + "public/icons/megaphone_760116-1-422-5733-f0074be50750.svg": "43fd7a092ba75f5efd858484f07d9ae7169fa044f674fbf7213743b853b4ad4d", + "public/icons/Frame-1000013807-422-5748-ae2fb3748882.svg": "05f5307c63820132c4c6026ba941bc955c83c38d6c16f249bea0cea7982b4220" + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 1920, + 1080 + ], + "actualDimensions": [ + 1920, + 1080 + ], + "changedPixels": 17371, + "totalPixels": 2073600, + "changedRatio": 0.00837721836419753, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 237, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W24-B-popup\\harness\\render\\out\\popup-422-5728.diff.png" + } + } + ] + ], + "spatial": [ + { + "name": "popup-422-5682", + "text": 8728, + "asset": 322, + "other": 2320, + "paintChanges": 361, + "hashes": { + "reference": "b70f8364a24570367868ce0e52c9f64643640a9e5dad9aa589d67633e7fcc155", + "baseline": "059c502c8c28229cd099ecc1202461d347c069cadd2ba2efee1a37aa0baace2f", + "candidate": "82b0544ad00211132d16591a65e41f11f01513c30f0c4df2d2b8c47310c89cab" + } + }, + { + "name": "popup-422-5705", + "text": 13392, + "asset": 426, + "other": 2403, + "paintChanges": 491, + "hashes": { + "reference": "c4e30d646e39234ef40f09e8e196baf2d3e72addbc4271d0b069193f8f0dc4ad", + "baseline": "ee43d4428b94262fc87460a413da67350f4a3446e8122a3bb53ae96a25ea71fe", + "candidate": "4eed90e59623f4fc0931ad81e1350dae33f3b7a9fe7c869abb52c2f415d91765" + } + }, + { + "name": "popup-422-5728", + "text": 14685, + "asset": 426, + "other": 2588, + "paintChanges": 491, + "hashes": { + "reference": "82ab13e4a18136875449cae8e1d34c13bbe0e74350e249d2674ec45dfad86444", + "baseline": "38ed76ac08098116a37b0c511fbf9b2a61c7b1ec5a7d89bd69aec2e428abcd00", + "candidate": "5bca365dbd2fc39040833a6917ef12dd63461a220e2bdcb5f01e7c5e0ffdae1b" + } + } + ], + "probes": [ + { + "id": "422:5682", + "width": 390, + "height": 800, + "source": [ + { + "id": "422:5682", + "type": "FRAME", + "box": { + "x": 0, + "y": 0, + "width": 390, + "height": 800 + }, + "stroke": [] + }, + { + "id": "422:5683", + "type": "FRAME", + "box": { + "x": 36.5, + "y": 211.5, + "width": 318, + "height": 377 + }, + "stroke": [] + }, + { + "id": "422:5684", + "type": "FRAME", + "box": { + "x": 36.5, + "y": 211.5, + "width": 318, + "height": 329 + }, + "stroke": [] + }, + { + "id": "422:5685", + "type": "FRAME", + "box": { + "x": 66.5, + "y": 241.5, + "width": 258, + "height": 192 + }, + "stroke": [] + }, + { + "id": "422:5686", + "type": "FRAME", + "box": { + "x": 66.5, + "y": 241.5, + "width": 64, + "height": 26 + }, + "stroke": [] + }, + { + "id": "422:5687", + "type": "FRAME", + "box": { + "x": 66.5, + "y": 244.5, + "width": 20, + "height": 20 + }, + "stroke": [] + }, + { + "id": "422:5688", + "type": "VECTOR", + "box": { + "x": 68.099609375, + "y": 258.3517761230469, + "width": 4.799975395202637, + "height": 4.627026081085205 + }, + "stroke": [] + }, + { + "id": "422:5689", + "type": "VECTOR", + "box": { + "x": 66.5, + "y": 250.5895843505859, + "width": 7.632458209991455, + "height": 7.827051639556885 + }, + "stroke": [] + }, + { + "id": "422:5690", + "type": "VECTOR", + "box": { + "x": 83.775390625, + "y": 250.80581665039065, + "width": 2.724302291870117, + "height": 7.178379535675049 + }, + "stroke": [] + }, + { + "id": "422:5691", + "type": "VECTOR", + "box": { + "x": 73.5703125, + "y": 245.8266143798828, + "width": 10.378362655639648, + "height": 17.346708297729492 + }, + "stroke": [] + }, + { + "id": "422:5692", + "type": "TEXT", + "characters": "안내", + "resize": "WIDTH_AND_HEIGHT", + "box": { + "x": 98.5, + "y": 241.5, + "width": 32, + "height": 26 + }, + "stroke": [], + "strokeAlign": "OUTSIDE" + }, + { + "id": "422:5693", + "type": "FRAME", + "box": { + "x": 66.5, + "y": 287.5, + "width": 258, + "height": 146 + }, + "stroke": [] + }, + { + "id": "422:5694", + "type": "TEXT", + "characters": "어려운 글을 쉽게 바꿔 주는 서비스 '온글'은 \n2026년 하반기부터 정식 서비스로 찾아올 \n예정입니다.\r", + "resize": "WIDTH_AND_HEIGHT", + "box": { + "x": 66.5, + "y": 287.5, + "width": 258, + "height": 78 + }, + "stroke": [], + "strokeAlign": "OUTSIDE" + }, + { + "id": "422:5695", + "type": "TEXT", + "characters": "온글의 소식을 가장 먼저 받아보고 싶다면 \n아래 버튼을 눌러 주세요.", + "resize": "WIDTH_AND_HEIGHT", + "box": { + "x": 66.5, + "y": 381.5, + "width": 247, + "height": 52 + }, + "stroke": [], + "strokeAlign": "OUTSIDE" + }, + { + "id": "422:5696", + "type": "FRAME", + "box": { + "x": 85.5, + "y": 469.5, + "width": 220, + "height": 41 + }, + "stroke": [] + }, + { + "id": "422:5697", + "type": "TEXT", + "characters": "서비스 소식 알림 받기", + "resize": "WIDTH_AND_HEIGHT", + "box": { + "x": 132.5, + "y": 481.5, + "width": 126, + "height": 17 + }, + "stroke": [], + "strokeAlign": "OUTSIDE" + }, + { + "id": "422:5698", + "type": "FRAME", + "box": { + "x": 36.5, + "y": 540.5, + "width": 318, + "height": 48 + }, + "stroke": [] + }, + { + "id": "422:5699", + "type": "FRAME", + "box": { + "x": 36.5, + "y": 540.5, + "width": 137, + "height": 48 + }, + "stroke": [] + }, + { + "id": "422:5700", + "type": "TEXT", + "characters": "오늘 하루 그만 보기", + "resize": "WIDTH_AND_HEIGHT", + "box": { + "x": 52.5, + "y": 556.5, + "width": 105, + "height": 16 + }, + "stroke": [], + "strokeAlign": "OUTSIDE" + }, + { + "id": "422:5701", + "type": "FRAME", + "box": { + "x": 272.5, + "y": 540.5, + "width": 82, + "height": 48 + }, + "stroke": [] + }, + { + "id": "422:5702", + "type": "FRAME", + "box": { + "x": 288.5, + "y": 556.5, + "width": 16, + "height": 16 + }, + "stroke": [] + }, + { + "id": "422:5703", + "type": "VECTOR", + "box": { + "x": 291.5, + "y": 559.5, + "width": 10, + "height": 10 + }, + "stroke": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:422:5755", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3157050907611847, + "g": 0.27816444635391235, + "r": 0.26207563281059265 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "strokeAlign": "CENTER" + }, + { + "id": "422:5704", + "type": "TEXT", + "characters": "닫기", + "resize": "WIDTH_AND_HEIGHT", + "box": { + "x": 314.5, + "y": 556.5, + "width": 24, + "height": 16 + }, + "stroke": [], + "strokeAlign": "OUTSIDE" + } + ], + "dom": [ + { + "tag": "DIV", + "text": null, + "box": { + "x": 0, + "y": 0, + "width": 390, + "height": 800 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": null + }, + { + "tag": "DIV", + "text": null, + "box": { + "x": 35.375, + "y": 211.5, + "width": 319.25, + "height": 377 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": null + }, + { + "tag": "DIV", + "text": null, + "box": { + "x": 35.375, + "y": 211.5, + "width": 319.25, + "height": 329 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": null + }, + { + "tag": "DIV", + "text": null, + "box": { + "x": 65.375, + "y": 241.5, + "width": 259.25, + "height": 192 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": null + }, + { + "tag": "DIV", + "text": null, + "box": { + "x": 65.375, + "y": 241.5, + "width": 259.25, + "height": 26 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": null + }, + { + "tag": "IMG", + "text": null, + "box": { + "x": 65.375, + "y": 244.5, + "width": 20, + "height": 20 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": "/icons/megaphone_760116-1-422-5687-ddd0aee2dd3c.svg,/icons/megaphone_760116-1-422-5710-9f758e0f819d.svg,,,/icons/megaphone_760116-1-422-5733-f0074be50750.svg", + "naturalWidth": 0, + "complete": true + }, + { + "tag": "SPAN", + "text": "안내", + "box": { + "x": 97.375, + "y": 241.5, + "width": 31.28125, + "height": 26 + }, + "font": "700 17px / 26px \"Noto Sans KR\"", + "whiteSpace": "normal", + "wordBreak": "keep-all", + "src": null + }, + { + "tag": "DIV", + "text": null, + "box": { + "x": 65.375, + "y": 287.5, + "width": 259.25, + "height": 146 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": null + }, + { + "tag": "SPAN", + "text": "어려운 글을 쉽게 바꿔 주는 서비스 '온글'은\n2026년 하반기부터 정식 서비스로 찾아올\n예정입니다.\n", + "box": { + "x": 65.375, + "y": 287.5, + "width": 259.25, + "height": 78 + }, + "font": "14.5px / 26px \"Noto Sans KR\"", + "whiteSpace": "normal", + "wordBreak": "keep-all", + "src": null + }, + { + "tag": "BR", + "text": null, + "box": { + "x": 324.625, + "y": 289.5, + "width": 0, + "height": 21 + }, + "font": "14.5px / 26px \"Noto Sans KR\"", + "whiteSpace": "normal", + "wordBreak": "keep-all", + "src": null + }, + { + "tag": "BR", + "text": null, + "box": { + "x": 313.90625, + "y": 315.5, + "width": 0, + "height": 21 + }, + "font": "14.5px / 26px \"Noto Sans KR\"", + "whiteSpace": "normal", + "wordBreak": "keep-all", + "src": null + }, + { + "tag": "BR", + "text": null, + "box": { + "x": 136.125, + "y": 341.5, + "width": 0, + "height": 21 + }, + "font": "14.5px / 26px \"Noto Sans KR\"", + "whiteSpace": "normal", + "wordBreak": "keep-all", + "src": null + }, + { + "tag": "SPAN", + "text": "온글의 소식을 가장 먼저 받아보고 싶다면\n아래 버튼을 눌러 주세요.", + "box": { + "x": 65.375, + "y": 381.5, + "width": 259.25, + "height": 52 + }, + "font": "14.5px / 26px \"Noto Sans KR\"", + "whiteSpace": "normal", + "wordBreak": "keep-all", + "src": null + }, + { + "tag": "BR", + "text": null, + "box": { + "x": 312.46875, + "y": 383.5, + "width": 0, + "height": 21 + }, + "font": "14.5px / 26px \"Noto Sans KR\"", + "whiteSpace": "normal", + "wordBreak": "keep-all", + "src": null + }, + { + "tag": "DIV", + "text": null, + "box": { + "x": 85, + "y": 469.5, + "width": 220, + "height": 41 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": null + }, + { + "tag": "SPAN", + "text": "서비스 소식 알림 받기", + "box": { + "x": 131.15625, + "y": 481.5, + "width": 127.6875, + "height": 17 + }, + "font": "700 14px / 17px \"Noto Sans KR\"", + "whiteSpace": "normal", + "wordBreak": "keep-all", + "src": null + }, + { + "tag": "DIV", + "text": null, + "box": { + "x": 35.375, + "y": 540.5, + "width": 319.25, + "height": 48 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": null + }, + { + "tag": "DIV", + "text": null, + "box": { + "x": 35.375, + "y": 540.5, + "width": 138.609375, + "height": 48 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": null + }, + { + "tag": "SPAN", + "text": "오늘 하루 그만 보기", + "box": { + "x": 51.375, + "y": 556.5, + "width": 106.609375, + "height": 16 + }, + "font": "500 13px / 16px \"Noto Sans KR\"", + "whiteSpace": "normal", + "wordBreak": "keep-all", + "src": null + }, + { + "tag": "DIV", + "text": null, + "box": { + "x": 272.703125, + "y": 540.5, + "width": 81.921875, + "height": 48 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": null + }, + { + "tag": "DIV", + "text": null, + "box": { + "x": 288.703125, + "y": 556.5, + "width": 16, + "height": 16 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": null + }, + { + "tag": "SPAN", + "text": "닫기", + "box": { + "x": 314.703125, + "y": 556.5, + "width": 23.921875, + "height": 16 + }, + "font": "500 13px / 16px \"Noto Sans KR\"", + "whiteSpace": "normal", + "wordBreak": "keep-all", + "src": null + } + ], + "baseline": { + "changed": 11370, + "percent": 3.644230769230769, + "text": 8699, + "asset": 322, + "other": 2349, + "bands": { + "200": 527, + "250": 1426, + "300": 3057, + "350": 2072, + "400": 1393, + "450": 1309, + "500": 370, + "550": 1216 + } + }, + "repairedImage": { + "changed": 11155, + "percent": 3.575320512820513, + "text": 8699, + "asset": 119, + "other": 2337, + "bands": { + "200": 473, + "250": 1265, + "300": 3057, + "350": 2072, + "400": 1393, + "450": 1309, + "500": 370, + "550": 1216 + } + }, + "repairedDom": [ + { + "src": "/icons/megaphone_760116-1-422-5687-ddd0aee2dd3c.svg", + "naturalWidth": 20, + "complete": true + } + ] + }, + { + "id": "422:5705", + "width": 768, + "height": 1024, + "source": [ + { + "id": "422:5705", + "type": "FRAME", + "box": { + "x": 0, + "y": 0, + "width": 768, + "height": 1024 + }, + "stroke": [] + }, + { + "id": "422:5706", + "type": "FRAME", + "box": { + "x": 184, + "y": 279.5, + "width": 400, + "height": 465 + }, + "stroke": [] + }, + { + "id": "422:5707", + "type": "FRAME", + "box": { + "x": 184, + "y": 279.5, + "width": 400, + "height": 407 + }, + "stroke": [] + }, + { + "id": "422:5708", + "type": "FRAME", + "box": { + "x": 224, + "y": 319.5, + "width": 320, + "height": 236 + }, + "stroke": [] + }, + { + "id": "422:5709", + "type": "FRAME", + "box": { + "x": 224, + "y": 319.5, + "width": 77, + "height": 30 + }, + "stroke": [] + }, + { + "id": "422:5710", + "type": "FRAME", + "box": { + "x": 224, + "y": 322.5, + "width": 24, + "height": 24 + }, + "stroke": [] + }, + { + "id": "422:5711", + "type": "VECTOR", + "box": { + "x": 225.919921875, + "y": 339.12213134765625, + "width": 5.759970664978027, + "height": 5.552431106567383 + }, + "stroke": [] + }, + { + "id": "422:5712", + "type": "VECTOR", + "box": { + "x": 224, + "y": 329.8074951171875, + "width": 9.158949851989746, + "height": 9.392461776733398 + }, + "stroke": [] + }, + { + "id": "422:5713", + "type": "VECTOR", + "box": { + "x": 244.73046875, + "y": 330.0669860839844, + "width": 3.269162654876709, + "height": 8.614055633544922 + }, + "stroke": [] + }, + { + "id": "422:5714", + "type": "VECTOR", + "box": { + "x": 232.484375, + "y": 324.0919189453125, + "width": 12.454034805297852, + "height": 20.816049575805664 + }, + "stroke": [] + }, + { + "id": "422:5715", + "type": "TEXT", + "characters": "안내", + "resize": "WIDTH_AND_HEIGHT", + "box": { + "x": 264, + "y": 319.5, + "width": 37, + "height": 30 + }, + "stroke": [], + "strokeAlign": "OUTSIDE" + }, + { + "id": "422:5716", + "type": "FRAME", + "box": { + "x": 224, + "y": 379.5, + "width": 320, + "height": 176 + }, + "stroke": [] + }, + { + "id": "422:5717", + "type": "TEXT", + "characters": "어려운 글을 쉽게 바꿔 주는 서비스 '온글'은 \n2026년 하반기부터 정식 서비스로 찾아올 \n예정입니다.\r", + "resize": "WIDTH_AND_HEIGHT", + "box": { + "x": 224, + "y": 379.5, + "width": 320, + "height": 96 + }, + "stroke": [], + "strokeAlign": "OUTSIDE" + }, + { + "id": "422:5718", + "type": "TEXT", + "characters": "온글의 소식을 가장 먼저 받아보고 싶다면 \n아래 버튼을 눌러 주세요.", + "resize": "WIDTH_AND_HEIGHT", + "box": { + "x": 224, + "y": 491.5, + "width": 306, + "height": 64 + }, + "stroke": [], + "strokeAlign": "OUTSIDE" + }, + { + "id": "422:5719", + "type": "FRAME", + "box": { + "x": 272, + "y": 595.5, + "width": 224, + "height": 51 + }, + "stroke": [] + }, + { + "id": "422:5720", + "type": "TEXT", + "characters": "서비스 소식 알림 받기", + "resize": "WIDTH_AND_HEIGHT", + "box": { + "x": 312, + "y": 611.5, + "width": 144, + "height": 19 + }, + "stroke": [], + "strokeAlign": "OUTSIDE" + }, + { + "id": "422:5721", + "type": "FRAME", + "box": { + "x": 184, + "y": 686.5, + "width": 400, + "height": 58 + }, + "stroke": [] + }, + { + "id": "422:5722", + "type": "FRAME", + "box": { + "x": 184, + "y": 686.5, + "width": 161, + "height": 58 + }, + "stroke": [] + }, + { + "id": "422:5723", + "type": "TEXT", + "characters": "오늘 하루 그만 보기", + "resize": "WIDTH_AND_HEIGHT", + "box": { + "x": 204, + "y": 706.5, + "width": 121, + "height": 18 + }, + "stroke": [], + "strokeAlign": "OUTSIDE" + }, + { + "id": "422:5724", + "type": "FRAME", + "box": { + "x": 490, + "y": 686.5, + "width": 94, + "height": 58 + }, + "stroke": [] + }, + { + "id": "422:5725", + "type": "FRAME", + "box": { + "x": 510, + "y": 707.5, + "width": 16, + "height": 16 + }, + "stroke": [] + }, + { + "id": "422:5726", + "type": "VECTOR", + "box": { + "x": 513, + "y": 710.5, + "width": 10, + "height": 10 + }, + "stroke": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:422:5755", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3157050907611847, + "g": 0.27816444635391235, + "r": 0.26207563281059265 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "strokeAlign": "CENTER" + }, + { + "id": "422:5727", + "type": "TEXT", + "characters": "닫기", + "resize": "WIDTH_AND_HEIGHT", + "box": { + "x": 536, + "y": 706.5, + "width": 28, + "height": 18 + }, + "stroke": [], + "strokeAlign": "OUTSIDE" + } + ], + "dom": [ + { + "tag": "DIV", + "text": null, + "box": { + "x": 0, + "y": 0, + "width": 768, + "height": 1024 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": null + }, + { + "tag": "DIV", + "text": null, + "box": { + "x": 183.078125, + "y": 279.5, + "width": 401.84375, + "height": 465 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": null + }, + { + "tag": "DIV", + "text": null, + "box": { + "x": 183.078125, + "y": 279.5, + "width": 401.84375, + "height": 407 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": null + }, + { + "tag": "DIV", + "text": null, + "box": { + "x": 223.078125, + "y": 319.5, + "width": 321.84375, + "height": 236 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": null + }, + { + "tag": "DIV", + "text": null, + "box": { + "x": 223.078125, + "y": 319.5, + "width": 321.84375, + "height": 30 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": null + }, + { + "tag": "IMG", + "text": null, + "box": { + "x": 223.078125, + "y": 322.5, + "width": 24, + "height": 24 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": "/icons/megaphone_760116-1-422-5687-ddd0aee2dd3c.svg,/icons/megaphone_760116-1-422-5710-9f758e0f819d.svg,,,/icons/megaphone_760116-1-422-5733-f0074be50750.svg", + "naturalWidth": 0, + "complete": true + }, + { + "tag": "SPAN", + "text": "안내", + "box": { + "x": 263.078125, + "y": 319.5, + "width": 36.8125, + "height": 30 + }, + "font": "700 20px / 30px \"Noto Sans KR\"", + "whiteSpace": "normal", + "wordBreak": "keep-all", + "src": null + }, + { + "tag": "DIV", + "text": null, + "box": { + "x": 223.078125, + "y": 379.5, + "width": 321.84375, + "height": 176 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": null + }, + { + "tag": "SPAN", + "text": "어려운 글을 쉽게 바꿔 주는 서비스 '온글'은\n2026년 하반기부터 정식 서비스로 찾아올\n예정입니다.\n", + "box": { + "x": 223.078125, + "y": 379.5, + "width": 321.84375, + "height": 96 + }, + "font": "18px / 32px \"Noto Sans KR\"", + "whiteSpace": "normal", + "wordBreak": "keep-all", + "src": null + }, + { + "tag": "BR", + "text": null, + "box": { + "x": 544.921875, + "y": 382.5, + "width": 0, + "height": 26 + }, + "font": "18px / 32px \"Noto Sans KR\"", + "whiteSpace": "normal", + "wordBreak": "keep-all", + "src": null + }, + { + "tag": "BR", + "text": null, + "box": { + "x": 531.609375, + "y": 414.5, + "width": 0, + "height": 26 + }, + "font": "18px / 32px \"Noto Sans KR\"", + "whiteSpace": "normal", + "wordBreak": "keep-all", + "src": null + }, + { + "tag": "BR", + "text": null, + "box": { + "x": 310.90625, + "y": 446.5, + "width": 0, + "height": 26 + }, + "font": "18px / 32px \"Noto Sans KR\"", + "whiteSpace": "normal", + "wordBreak": "keep-all", + "src": null + }, + { + "tag": "SPAN", + "text": "온글의 소식을 가장 먼저 받아보고 싶다면\n아래 버튼을 눌러 주세요.", + "box": { + "x": 223.078125, + "y": 491.5, + "width": 321.84375, + "height": 64 + }, + "font": "18px / 32px \"Noto Sans KR\"", + "whiteSpace": "normal", + "wordBreak": "keep-all", + "src": null + }, + { + "tag": "BR", + "text": null, + "box": { + "x": 529.8125, + "y": 494.5, + "width": 0, + "height": 26 + }, + "font": "18px / 32px \"Noto Sans KR\"", + "whiteSpace": "normal", + "wordBreak": "keep-all", + "src": null + }, + { + "tag": "DIV", + "text": null, + "box": { + "x": 271.03125, + "y": 595.5, + "width": 225.921875, + "height": 51 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": null + }, + { + "tag": "SPAN", + "text": "서비스 소식 알림 받기", + "box": { + "x": 311.03125, + "y": 611.5, + "width": 145.921875, + "height": 19 + }, + "font": "700 16px / 19px \"Noto Sans KR\"", + "whiteSpace": "normal", + "wordBreak": "keep-all", + "src": null + }, + { + "tag": "DIV", + "text": null, + "box": { + "x": 183.078125, + "y": 686.5, + "width": 401.84375, + "height": 58 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": null + }, + { + "tag": "DIV", + "text": null, + "box": { + "x": 183.078125, + "y": 686.5, + "width": 163, + "height": 58 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": null + }, + { + "tag": "SPAN", + "text": "오늘 하루 그만 보기", + "box": { + "x": 203.078125, + "y": 706.5, + "width": 123, + "height": 18 + }, + "font": "500 15px / 18px \"Noto Sans KR\"", + "whiteSpace": "normal", + "wordBreak": "keep-all", + "src": null + }, + { + "tag": "DIV", + "text": null, + "box": { + "x": 491.3125, + "y": 686.5, + "width": 93.609375, + "height": 58 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": null + }, + { + "tag": "DIV", + "text": null, + "box": { + "x": 511.3125, + "y": 707.5, + "width": 16, + "height": 16 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": null + }, + { + "tag": "SPAN", + "text": "닫기", + "box": { + "x": 537.3125, + "y": 706.5, + "width": 27.609375, + "height": 18 + }, + "font": "500 15px / 18px \"Noto Sans KR\"", + "whiteSpace": "normal", + "wordBreak": "keep-all", + "src": null + } + ], + "baseline": { + "changed": 16221, + "percent": 2.0626068115234375, + "text": 13392, + "asset": 426, + "other": 2403, + "bands": { + "250": 436, + "300": 865, + "350": 2346, + "400": 3620, + "450": 912, + "500": 4594, + "550": 300, + "600": 1514, + "650": 100, + "700": 1534 + } + }, + "repairedImage": { + "changed": 15893, + "percent": 2.0208994547526045, + "text": 13392, + "asset": 112, + "other": 2389, + "bands": { + "250": 436, + "300": 537, + "350": 2346, + "400": 3620, + "450": 912, + "500": 4594, + "550": 300, + "600": 1514, + "650": 100, + "700": 1534 + } + }, + "repairedDom": [ + { + "src": "/icons/megaphone_760116-1-422-5710-9f758e0f819d.svg", + "naturalWidth": 24, + "complete": true + } + ] + }, + { + "id": "422:5728", + "width": 1920, + "height": 1080, + "source": [ + { + "id": "422:5728", + "type": "FRAME", + "box": { + "x": 0, + "y": 0, + "width": 1920, + "height": 1080 + }, + "stroke": [] + }, + { + "id": "422:5729", + "type": "FRAME", + "box": { + "x": 742, + "y": 287.5, + "width": 436, + "height": 505 + }, + "stroke": [] + }, + { + "id": "422:5730", + "type": "FRAME", + "box": { + "x": 742, + "y": 287.5, + "width": 436, + "height": 446 + }, + "stroke": [] + }, + { + "id": "422:5731", + "type": "FRAME", + "box": { + "x": 782, + "y": 327.5, + "width": 356, + "height": 262 + }, + "stroke": [] + }, + { + "id": "422:5732", + "type": "FRAME", + "box": { + "x": 782, + "y": 327.5, + "width": 85, + "height": 36 + }, + "stroke": [] + }, + { + "id": "422:5733", + "type": "FRAME", + "box": { + "x": 782, + "y": 333.5, + "width": 24, + "height": 24 + }, + "stroke": [] + }, + { + "id": "422:5734", + "type": "VECTOR", + "box": { + "x": 783.919921875, + "y": 350.12213134765625, + "width": 5.759970664978027, + "height": 5.552431106567383 + }, + "stroke": [] + }, + { + "id": "422:5735", + "type": "VECTOR", + "box": { + "x": 782, + "y": 340.8074951171875, + "width": 9.158949851989746, + "height": 9.392461776733398 + }, + "stroke": [] + }, + { + "id": "422:5736", + "type": "VECTOR", + "box": { + "x": 802.73046875, + "y": 341.0669860839844, + "width": 3.269162654876709, + "height": 8.614055633544922 + }, + "stroke": [] + }, + { + "id": "422:5737", + "type": "VECTOR", + "box": { + "x": 790.484375, + "y": 335.0919189453125, + "width": 12.454034805297852, + "height": 20.816049575805664 + }, + "stroke": [] + }, + { + "id": "422:5738", + "type": "TEXT", + "characters": "안내", + "resize": "WIDTH_AND_HEIGHT", + "box": { + "x": 822, + "y": 327.5, + "width": 45, + "height": 36 + }, + "stroke": [], + "strokeAlign": "OUTSIDE" + }, + { + "id": "422:5739", + "type": "FRAME", + "box": { + "x": 782, + "y": 393.5, + "width": 356, + "height": 196 + }, + "stroke": [] + }, + { + "id": "422:5740", + "type": "TEXT", + "characters": "어려운 글을 쉽게 바꿔 주는 서비스 '온글'은 \n2026년 하반기부터 정식 서비스로 찾아올 \n예정입니다.\r", + "resize": "WIDTH_AND_HEIGHT", + "box": { + "x": 782, + "y": 393.5, + "width": 356, + "height": 108 + }, + "stroke": [], + "strokeAlign": "OUTSIDE" + }, + { + "id": "422:5741", + "type": "TEXT", + "characters": "온글의 소식을 가장 먼저 받아보고 싶다면 \n아래 버튼을 눌러 주세요.", + "resize": "WIDTH_AND_HEIGHT", + "box": { + "x": 782, + "y": 517.5, + "width": 340, + "height": 72 + }, + "stroke": [], + "strokeAlign": "OUTSIDE" + }, + { + "id": "422:5742", + "type": "FRAME", + "box": { + "x": 839, + "y": 639.5, + "width": 242, + "height": 54 + }, + "stroke": [] + }, + { + "id": "422:5743", + "type": "TEXT", + "characters": "서비스 소식 알림 받기", + "resize": "WIDTH_AND_HEIGHT", + "box": { + "x": 879, + "y": 655.5, + "width": 162, + "height": 22 + }, + "stroke": [], + "strokeAlign": "OUTSIDE" + }, + { + "id": "422:5744", + "type": "FRAME", + "box": { + "x": 742, + "y": 733.5, + "width": 436, + "height": 59 + }, + "stroke": [] + }, + { + "id": "422:5745", + "type": "FRAME", + "box": { + "x": 742, + "y": 733.5, + "width": 169, + "height": 59 + }, + "stroke": [] + }, + { + "id": "422:5746", + "type": "TEXT", + "characters": "오늘 하루 그만 보기", + "resize": "WIDTH_AND_HEIGHT", + "box": { + "x": 762, + "y": 753.5, + "width": 129, + "height": 19 + }, + "stroke": [], + "strokeAlign": "OUTSIDE" + }, + { + "id": "422:5747", + "type": "FRAME", + "box": { + "x": 1079, + "y": 733.5, + "width": 99, + "height": 59 + }, + "stroke": [] + }, + { + "id": "422:5748", + "type": "FRAME", + "box": { + "x": 1099, + "y": 753.5, + "width": 19, + "height": 19 + }, + "stroke": [] + }, + { + "id": "422:5749", + "type": "VECTOR", + "box": { + "x": 1102.5625, + "y": 757.0625, + "width": 11.875, + "height": 11.875 + }, + "stroke": [ + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:422:5755", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.3157050907611847, + "g": 0.27816444635391235, + "r": 0.26207563281059265 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + } + ], + "strokeAlign": "CENTER" + }, + { + "id": "422:5750", + "type": "TEXT", + "characters": "닫기", + "resize": "WIDTH_AND_HEIGHT", + "box": { + "x": 1128, + "y": 753.5, + "width": 30, + "height": 19 + }, + "stroke": [], + "strokeAlign": "OUTSIDE" + } + ], + "dom": [ + { + "tag": "DIV", + "text": null, + "box": { + "x": 0, + "y": 0, + "width": 1920, + "height": 1080 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": null + }, + { + "tag": "DIV", + "text": null, + "box": { + "x": 741.1875, + "y": 287.5, + "width": 437.609375, + "height": 505 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": null + }, + { + "tag": "DIV", + "text": null, + "box": { + "x": 741.1875, + "y": 287.5, + "width": 437.609375, + "height": 446 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": null + }, + { + "tag": "DIV", + "text": null, + "box": { + "x": 781.1875, + "y": 327.5, + "width": 357.609375, + "height": 262 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": null + }, + { + "tag": "DIV", + "text": null, + "box": { + "x": 781.1875, + "y": 327.5, + "width": 357.609375, + "height": 36 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": null + }, + { + "tag": "IMG", + "text": null, + "box": { + "x": 781.1875, + "y": 333.5, + "width": 24, + "height": 24 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": "/icons/megaphone_760116-1-422-5687-ddd0aee2dd3c.svg,/icons/megaphone_760116-1-422-5710-9f758e0f819d.svg,,,/icons/megaphone_760116-1-422-5733-f0074be50750.svg", + "naturalWidth": 0, + "complete": true + }, + { + "tag": "SPAN", + "text": "안내", + "box": { + "x": 821.1875, + "y": 327.5, + "width": 44.171875, + "height": 36 + }, + "font": "700 24px / 36px \"Noto Sans KR\"", + "whiteSpace": "normal", + "wordBreak": "keep-all", + "src": null + }, + { + "tag": "DIV", + "text": null, + "box": { + "x": 781.1875, + "y": 393.5, + "width": 357.609375, + "height": 196 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": null + }, + { + "tag": "SPAN", + "text": "어려운 글을 쉽게 바꿔 주는 서비스 '온글'은\n2026년 하반기부터 정식 서비스로 찾아올\n예정입니다.\n", + "box": { + "x": 781.1875, + "y": 393.5, + "width": 357.609375, + "height": 108 + }, + "font": "20px / 36px \"Noto Sans KR\"", + "whiteSpace": "normal", + "wordBreak": "keep-all", + "src": null + }, + { + "tag": "BR", + "text": null, + "box": { + "x": 1138.796875, + "y": 396.5, + "width": 0, + "height": 29 + }, + "font": "20px / 36px \"Noto Sans KR\"", + "whiteSpace": "normal", + "wordBreak": "keep-all", + "src": null + }, + { + "tag": "BR", + "text": null, + "box": { + "x": 1124, + "y": 432.5, + "width": 0, + "height": 29 + }, + "font": "20px / 36px \"Noto Sans KR\"", + "whiteSpace": "normal", + "wordBreak": "keep-all", + "src": null + }, + { + "tag": "BR", + "text": null, + "box": { + "x": 878.78125, + "y": 468.5, + "width": 0, + "height": 29 + }, + "font": "20px / 36px \"Noto Sans KR\"", + "whiteSpace": "normal", + "wordBreak": "keep-all", + "src": null + }, + { + "tag": "SPAN", + "text": "온글의 소식을 가장 먼저 받아보고 싶다면\n아래 버튼을 눌러 주세요.", + "box": { + "x": 781.1875, + "y": 517.5, + "width": 357.609375, + "height": 72 + }, + "font": "20px / 36px \"Noto Sans KR\"", + "whiteSpace": "normal", + "wordBreak": "keep-all", + "src": null + }, + { + "tag": "BR", + "text": null, + "box": { + "x": 1122, + "y": 520.5, + "width": 0, + "height": 29 + }, + "font": "20px / 36px \"Noto Sans KR\"", + "whiteSpace": "normal", + "wordBreak": "keep-all", + "src": null + }, + { + "tag": "DIV", + "text": null, + "box": { + "x": 837.90625, + "y": 639.5, + "width": 244.171875, + "height": 54 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": null + }, + { + "tag": "SPAN", + "text": "서비스 소식 알림 받기", + "box": { + "x": 877.90625, + "y": 655.5, + "width": 164.171875, + "height": 22 + }, + "font": "700 18px / 22px \"Noto Sans KR\"", + "whiteSpace": "normal", + "wordBreak": "keep-all", + "src": null + }, + { + "tag": "DIV", + "text": null, + "box": { + "x": 741.1875, + "y": 733.5, + "width": 437.609375, + "height": 59 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": null + }, + { + "tag": "DIV", + "text": null, + "box": { + "x": 741.1875, + "y": 733.5, + "width": 171.203125, + "height": 59 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": null + }, + { + "tag": "SPAN", + "text": "오늘 하루 그만 보기", + "box": { + "x": 761.1875, + "y": 753.5, + "width": 131.203125, + "height": 19 + }, + "font": "500 16px / 19px \"Noto Sans KR\"", + "whiteSpace": "normal", + "wordBreak": "keep-all", + "src": null + }, + { + "tag": "DIV", + "text": null, + "box": { + "x": 1080.34375, + "y": 733.5, + "width": 98.453125, + "height": 59 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": null + }, + { + "tag": "DIV", + "text": null, + "box": { + "x": 1100.34375, + "y": 753.5, + "width": 19, + "height": 19 + }, + "font": "16px / 24px Pretendard, \"Noto Sans KR\", sans-serif", + "whiteSpace": "normal", + "wordBreak": "normal", + "src": null + }, + { + "tag": "SPAN", + "text": "닫기", + "box": { + "x": 1129.34375, + "y": 753.5, + "width": 29.453125, + "height": 19 + }, + "font": "500 16px / 19px \"Noto Sans KR\"", + "whiteSpace": "normal", + "wordBreak": "keep-all", + "src": null + } + ], + "baseline": { + "changed": 17699, + "percent": 0.853539737654321, + "text": 14684, + "asset": 426, + "other": 2589, + "bands": { + "250": 456, + "300": 649, + "350": 324, + "400": 5191, + "450": 1938, + "500": 3172, + "550": 1831, + "600": 317, + "650": 2062, + "700": 100, + "750": 1659 + } + }, + "repairedImage": { + "changed": 17371, + "percent": 0.8377218364197531, + "text": 14684, + "asset": 112, + "other": 2575, + "bands": { + "250": 456, + "300": 389, + "350": 256, + "400": 5191, + "450": 1938, + "500": 3172, + "550": 1831, + "600": 317, + "650": 2062, + "700": 100, + "750": 1659 + } + }, + "repairedDom": [ + { + "src": "/icons/megaphone_760116-1-422-5733-f0074be50750.svg", + "naturalWidth": 24, + "complete": true + } + ] + } + ], + "residual": [ + { + "width": 390, + "candidate": { + "changed": 11155, + "percent": 3.575320512820513 + }, + "images": [ + { + "src": "/icons/megaphone_760116-1-422-5687-ddd0aee2dd3c.svg", + "naturalWidth": 20, + "display": "block", + "box": { + "x": 65.375, + "y": 244.5, + "width": 20, + "height": 20 + } + }, + { + "src": "/icons/megaphone_760116-1-422-5710-9f758e0f819d.svg", + "naturalWidth": 24, + "display": "none", + "box": { + "x": 0, + "y": 0, + "width": 0, + "height": 0 + } + }, + { + "src": "/icons/megaphone_760116-1-422-5733-f0074be50750.svg", + "naturalWidth": 24, + "display": "none", + "box": { + "x": 0, + "y": 0, + "width": 0, + "height": 0 + } + } + ], + "noKerning": { + "changed": 11155, + "percent": 3.575320512820513 + }, + "forcedSourceTextWidths": { + "changed": 56635, + "percent": 18.152243589743588 + }, + "forcedBoxes": [ + { + "text": "안내", + "width": 32, + "height": 26 + }, + { + "text": "어려운 글을 쉽게 바꿔 주는 서비스 '온글'은\n2026년 하반기부터 정식 서비스로 찾아올\n예정입니다.\n", + "width": 258, + "height": 104 + }, + { + "text": "온글의 소식을 가장 먼저 받아보고 싶다면\n아래 버튼을 눌러 주세요.", + "width": 247, + "height": 78 + }, + { + "text": "서비스 소식 알림 받기", + "width": 126, + "height": 34 + }, + { + "text": "오늘 하루 그만 보기", + "width": 105, + "height": 32 + }, + { + "text": "닫기", + "width": 24, + "height": 16 + } + ] + }, + { + "width": 768, + "candidate": { + "changed": 15893, + "percent": 2.0208994547526045 + }, + "images": [ + { + "src": "/icons/megaphone_760116-1-422-5687-ddd0aee2dd3c.svg", + "naturalWidth": 20, + "display": "none", + "box": { + "x": 0, + "y": 0, + "width": 0, + "height": 0 + } + }, + { + "src": "/icons/megaphone_760116-1-422-5710-9f758e0f819d.svg", + "naturalWidth": 24, + "display": "block", + "box": { + "x": 223.078125, + "y": 322.5, + "width": 24, + "height": 24 + } + }, + { + "src": "/icons/megaphone_760116-1-422-5733-f0074be50750.svg", + "naturalWidth": 24, + "display": "none", + "box": { + "x": 0, + "y": 0, + "width": 0, + "height": 0 + } + } + ], + "noKerning": { + "changed": 15893, + "percent": 2.0208994547526045 + }, + "forcedSourceTextWidths": { + "changed": 81857, + "percent": 10.408655802408855 + }, + "forcedBoxes": [ + { + "text": "안내", + "width": 37, + "height": 30 + }, + { + "text": "어려운 글을 쉽게 바꿔 주는 서비스 '온글'은\n2026년 하반기부터 정식 서비스로 찾아올\n예정입니다.\n", + "width": 320, + "height": 128 + }, + { + "text": "온글의 소식을 가장 먼저 받아보고 싶다면\n아래 버튼을 눌러 주세요.", + "width": 306, + "height": 96 + }, + { + "text": "서비스 소식 알림 받기", + "width": 144, + "height": 38 + }, + { + "text": "오늘 하루 그만 보기", + "width": 121, + "height": 36 + }, + { + "text": "닫기", + "width": 28, + "height": 18 + } + ] + }, + { + "width": 1920, + "candidate": { + "changed": 17371, + "percent": 0.8377218364197531 + }, + "images": [ + { + "src": "/icons/megaphone_760116-1-422-5687-ddd0aee2dd3c.svg", + "naturalWidth": 20, + "display": "none", + "box": { + "x": 0, + "y": 0, + "width": 0, + "height": 0 + } + }, + { + "src": "/icons/megaphone_760116-1-422-5710-9f758e0f819d.svg", + "naturalWidth": 24, + "display": "none", + "box": { + "x": 0, + "y": 0, + "width": 0, + "height": 0 + } + }, + { + "src": "/icons/megaphone_760116-1-422-5733-f0074be50750.svg", + "naturalWidth": 24, + "display": "block", + "box": { + "x": 781.1875, + "y": 333.5, + "width": 24, + "height": 24 + } + } + ], + "noKerning": { + "changed": 17371, + "percent": 0.8377218364197531 + }, + "forcedSourceTextWidths": { + "changed": 99193, + "percent": 4.783613040123457 + }, + "forcedBoxes": [ + { + "text": "안내", + "width": 45, + "height": 36 + }, + { + "text": "어려운 글을 쉽게 바꿔 주는 서비스 '온글'은\n2026년 하반기부터 정식 서비스로 찾아올\n예정입니다.\n", + "width": 356, + "height": 144 + }, + { + "text": "온글의 소식을 가장 먼저 받아보고 싶다면\n아래 버튼을 눌러 주세요.", + "width": 340, + "height": 108 + }, + { + "text": "서비스 소식 알림 받기", + "width": 162, + "height": 44 + }, + { + "text": "오늘 하루 그만 보기", + "width": 129, + "height": 38 + }, + { + "text": "닫기", + "width": 30, + "height": 19 + } + ] + } + ], + "fidelity": { + "state": "produced", + "projection": "lossy", + "fidelity": { + "scope": "breakpoint-source-projections", + "sourceOutput": "tsx", + "breakpoints": [ + { + "rootId": "422:5682", + "fidelity": { + "syntaxValid": true, + "nodes": { + "total": 23, + "covered": 23, + "basisPoints": 10000 + }, + "text": { + "total": 6, + "covered": 6, + "basisPoints": 10000 + }, + "variables": { + "total": 9, + "covered": 9, + "basisPoints": 10000 + }, + "typography": { + "total": 6, + "covered": 6, + "basisPoints": 10000 + }, + "assets": { + "total": 2, + "covered": 2, + "basisPoints": 10000 + }, + "layout": { + "total": 37, + "covered": 36, + "basisPoints": 9729 + }, + "impacts": { + "none": 11, + "approximated": 0, + "lossy": 3, + "failed": 0 + }, + "uncoveredLayout": [ + "422:5698#layoutSizingHorizontal" + ] + } + }, + { + "rootId": "422:5705", + "fidelity": { + "syntaxValid": true, + "nodes": { + "total": 23, + "covered": 23, + "basisPoints": 10000 + }, + "text": { + "total": 6, + "covered": 6, + "basisPoints": 10000 + }, + "variables": { + "total": 9, + "covered": 9, + "basisPoints": 10000 + }, + "typography": { + "total": 6, + "covered": 6, + "basisPoints": 10000 + }, + "assets": { + "total": 2, + "covered": 2, + "basisPoints": 10000 + }, + "layout": { + "total": 36, + "covered": 35, + "basisPoints": 9722 + }, + "impacts": { + "none": 11, + "approximated": 0, + "lossy": 3, + "failed": 0 + }, + "uncoveredLayout": [ + "422:5721#layoutSizingHorizontal" + ] + } + }, + { + "rootId": "422:5728", + "fidelity": { + "syntaxValid": true, + "nodes": { + "total": 23, + "covered": 23, + "basisPoints": 10000 + }, + "text": { + "total": 6, + "covered": 6, + "basisPoints": 10000 + }, + "variables": { + "total": 9, + "covered": 9, + "basisPoints": 10000 + }, + "typography": { + "total": 6, + "covered": 6, + "basisPoints": 10000 + }, + "assets": { + "total": 2, + "covered": 2, + "basisPoints": 10000 + }, + "layout": { + "total": 36, + "covered": 35, + "basisPoints": 9722 + }, + "impacts": { + "none": 11, + "approximated": 0, + "lossy": 3, + "failed": 0 + }, + "uncoveredLayout": [ + "422:5744#layoutSizingHorizontal" + ] + } + } + ], + "syntaxValid": true, + "mergedMappingVerified": false, + "unrepresentedCount": 0, + "note": "Breakpoint reports describe their source projections; they do not certify the merged responsive module. Review responsiveUnrepresented and projectionIssues." + }, + "mappingComplete": false + }, + "quality": { + "acquisition": "complete", + "projection": "lossy", + "theme": "complete", + "assets": "not-requested" + } +} diff --git a/docs/popup-image-sources.md b/docs/popup-image-sources.md new file mode 100644 index 0000000..89854a7 --- /dev/null +++ b/docs/popup-image-sources.md @@ -0,0 +1,196 @@ +# Popup: responsive image sources and the shared text residual + +Investigated all three popup widths from production sources at +`937313e39448db7f7c05dbb0ab206432261b2203`. One source-data defect is fixed: +different image URLs were merged into an HTML `src` array. The remaining +intrinsic text-width differences are separately quantified below. + +## Own baseline and localisation + +All seven preceding reports named in the dispatch were read before choosing +a cause. The worktree built its own baseline executable, freshly acquired +popup, and rendered it twice with the unchanged harness scripts. Acquisition +and rendering ran in an isolated copy of the harness with the main checkout's +banked calls and unchanged visual comparator. The generated files were not +shared with the other workers. Each rendering used popup's own theme, +`d541f2ae9049`, the full reference viewport, and disabled animations. + +Baseline SHA-256: +`0ae51b1421d38fe3ca7c7cf079e1f6a28e39f1e77d9e9e5784178df5a47155ab`. +The build metadata says `937313e39448-dirty`: temporary, untracked harness +setup directories existed when the build script ran. No production source +or test had changed when this executable was built; those setup directories +were removed. This is the own measured baseline, not a threshold value. + +| Screen | Frame pixels | Own baseline, both runs | Changed pixels | +| --- | ---: | ---: | ---: | +| popup-422-5682, 390px | 312,000 | 3.6442307692% | 11,370 | +| popup-422-5705, 768px | 786,432 | 2.0626068115% | 16,221 | +| popup-422-5728, 1920px | 2,073,600 | 0.8535397377% | 17,699 | + +The mobile frame has fewer changed pixels than desktop, but desktop has +6.646 times its frame area. Their changed-pixel ratio is 0.6424, producing +the observed 4.2696-fold percentage ratio. This denominator effect is not a +complete causal account: the following shared features were checked directly. + +* All three screenshots show the same broken megaphone image. +* All six text boxes at every width have the collected Y positions and + heights. There is no accumulating vertical drift, extra paragraph line, + or missing resolved font weight in the baseline. +* The widest HUG paragraph sets the HUG card's intrinsic width. Its browser + width exceeds the collected width at every size, shifting centered content. +* No popup container has a painted OUTSIDE stroke. The only painted strokes + are CENTER strokes on the exported close-icon vectors. Rounded outside + borders cannot explain these captures. +* No cropped photo or offset HUG mask appears in the broken megaphone path. + +Changed pixels within the union of source and browser text boxes are +8,728 / 13,392 / 14,685, respectively: about 76.8% / 82.6% / 83.0% of the +baseline differences. This is a spatial partition, not an assertion that all +those pixels are caused by font rasterisation. The evidence JSON also retains +the 50px vertical bands, full node boxes, DOM boxes, fonts, and asset data. + +## Proven defect and correction + +The collected megaphone nodes are `422:5687`, `422:5710`, and `422:5733`. +They export valid SVGs at 20x20, 24x24, and 24x24. The responsive module +previously emitted their three asset paths as `src={[mobile, tablet, null, +null, desktop]}`. `src` is an HTML attribute, not a devup-ui CSS property; +React serialises this array into one comma-separated URL. Chromium reports +`naturalWidth=0` and paints a broken-image indicator at every width. + +A browser-only probe assigned each frame's actual collected SVG URL to that +image, preserving every layout and text style. It removed 215 / 328 / 328 +changed pixels. This proved the representation error before implementation. + +`codegen/responsive.rs` now includes the scalar image source in a child +image's matching identity. Different sources remain separate children and +the existing missing-child merge supplies their display arrays. Equal +sources still merge. A present image explicitly restores its natural display +when absent from another drawn slot, including an image present only in the +middle slot. Its original explicit display value, if any, takes precedence. + +The condition reads component kind and projected source values. No viewport +condition, new breakpoint rule, frame ID, image dimensions, or fitted constant +was added. Existing slot placement and visibility machinery is reused. +The change is limited to child images; a whole responsive root that folds +directly to an Image is outside this matching path and is not claimed fixed. + +This retains three real image elements, one displayed at a time. Browsers may +download hidden sources; the correction does not claim picture/source-style +network selection. Browser verification confirms each SVG loads and exactly +the intended image is visible at each captured width. + +## Tests first, fidelity, and corpus + +`popup-images-red.log` records **1 passed / 2 failed** before implementation: +the converter emitted array-valued `src` and failed to preserve a returning +source as a separate image. The first candidate additionally exposed the +middle-only image's missing display restoration. All three final tests pass, +covering two different slot layouts, three distinct sources, identical +sources, and a source that disappears and returns. These are synthetic data +tests and do not rely on the popup node IDs or capture widths. + +No style, layout, text, or provenance source file changed. No new source-map +mapping is introduced. Responsive output continues to report +`mergedMappingVerified=false`; its source fidelity explicitly describes +the individual breakpoint projections, not the merged module. The acquired +candidate remains `projection=lossy`, preserving its existing whitespace and +layout limitations. It is not promoted to exact or mapping-complete. +The scalar URLs still identify the original node exports and manifest assets. + +The plugin-answer captures and their three thresholds are comparison +baselines, not targets; none was edited. The 268 plugin goldens and manifest +are unchanged. Corpus and final-gate results are recorded below. + +## Repeated generator measurement + +Candidate SHA-256: +`eb54a7c9c6e2517ef4308b8376915d04d37b475a16b01c91f6921ccee84304bb`. +After the complete gate, the own binary was rebuilt and preserved. Both +final candidate runs freshly reacquired popup with that exact executable; +no acquisition identity check was bypassed. They reproduce the earlier +candidate's paired measurements, whose preserved binary hash is +`ece1dc9b8b68657b05a93973232636784bd54b6bf42b68f3fcac6ec0bcb1a0ab`. + +| Screen width | Own baseline, repeated | Candidate, repeated | Pixels removed | Improvement | +| --- | ---: | ---: | ---: | ---: | +| 390 | 3.6442307692% | 3.5753205128% | 215 | 0.0689102564pp | +| 768 | 2.0626068115% | 2.0208994548% | 328 | 0.0417073568pp | +| 1920 | 0.8535397377% | 0.8377218364% | 328 | 0.0158179012pp | + +The candidate exactly reproduces the isolated image-repair probe's metrics. +Frame dimensions, theme and reference inputs are unchanged. Only the three +generated popup thresholds move, to 3.58 / 2.02 / 0.84; tolerance and all +plugin-answer thresholds stay unchanged. Other screen groups were not +visually remeasured by this popup worker; the full repository gate covers +their generated-code contracts. + +## Bounded negative: HUG text metrics + +The baseline's longest paragraph has these measured boxes: + +| Width | Source text width | Browser width | Source X | Browser X | Height, both | +| --- | ---: | ---: | ---: | ---: | ---: | +| 390 | 258 | 259.25 | 66.5 | 65.375 | 78 | +| 768 | 320 | 321.84375 | 224 | 223.078125 | 96 | +| 1920 | 356 | 357.609375 | 782 | 781.1875 | 108 | + +Every popup text node is `textAutoResize=WIDTH_AND_HEIGHT`. This is the HUG +case intentionally excluded from the previous hard-break whitespace fix. +The existing report already proves that adding `pre-wrap` increases these +intrinsic widths; that rejected experiment was not reimplemented. + +Two independent browser probes were run after repairing the image: + +| Probe | 390 | 768 | 1920 | +| --- | ---: | ---: | ---: | +| Disable font kerning | 11,155 pixels, unchanged | 15,893, unchanged | 17,371, unchanged | +| Force all text to collected widths | 18.15224% | 10.40866% | 4.78361% | + +The latter is a rejected diagnostic, not a candidate. The first paragraph +grows from 78 to 104px, 96 to 128px, and 108 to 144px; the second paragraph +and some controls also gain lines. A collected width cannot simply replace +HUG sizing when the browser's glyph advances require more space. It would +also change the intended content-driven sizing contract. + +Korean `keep-all` was retained in every production change and browser probe. +For conservative mobile defect accounting, reserving the owner's 0.21pp +allowance leaves **3.4342307692pp before / 3.3653205128pp after**. This is an +accounting allowance originally measured on about mobile, not a new claim +that popup has exactly that wrapping floor: the baseline popup paragraph +boxes show no soft-wrap disagreement. No intentional Korean wrapping +difference is offered as a defect or improvement. The next bounded +lead is the font's resolved advances and intrinsic text-width computation; +neither kerning removal nor forcing the measured HUG width resolves it. +Matching box positions does not prove matching glyph rasterisation. + +## Verification and artifacts + +[popup-image-sources-evidence.json](popup-image-sources-evidence.json) retains +the exact four measurement runs, binary identities, reference/actual hashes, +spatial partition, source/DOM geometry, image-loading proof, rejected probes, +and the candidate's unchanged fidelity limitations. Raw logs and probe PNGs +are in this worktree's ignored `harness/render/out/popup-*` paths. + +All Cargo commands use the own target, two jobs, +`CARGO_PROFILE_DEV_DEBUG=0`, `CARGO_PROFILE_TEST_DEBUG=0`, and +`CARGO_INCREMENTAL=0`; `CARGO_TARGET_DIR` is never set. + +| Required gate | Result | +| --- | --- | +| `cargo fmt --all -- --check` | Pass | +| `cargo clippy --locked --workspace --all-targets --all-features -j 2 -- -D warnings` | Pass, zero warnings | +| `cargo test --workspace -j 2 --no-fail-fast` | 1,115 passed, 0 failed, 2 ignored | +| `cargo insta test --workspace --all-features --check` | 1,115 passed, 0 failed, 2 ignored; no snapshots to review | +| `cargo test --locked -p devup-mcp --test stdio_smoke -j 2` | 2 passed, 0 failed | + +The unchanged plugin corpus consistency and byte-parity tests pass, as does +`korean_characters_keep_words_whole`. Ordinary MSVC link steps retain their +existing localized library-creation warning; the Clippy gate has zero warnings. +No off-limits file, plugin golden, manifest checksum, or harness script changed. + +This is one local fix commit without a push. The task's preview and acquisition +processes are stopped, and the worktree's own target is cleaned after committing. +The modified production file is `codegen/responsive.rs`; there is no overlap +with `codegen/style.rs`, `layout.rs`, `text.rs`, or `provenance.rs`. diff --git a/harness/render/thresholds.json b/harness/render/thresholds.json index 772493a..45497d2 100644 --- a/harness/render/thresholds.json +++ b/harness/render/thresholds.json @@ -2,9 +2,9 @@ "note": "Current generated-screen baselines are backed by two fresh-process acquire/render measurements on d039623, with identical input hashes and exact divergence values; see docs/harness-determinism.md and its evidence JSON. Notice tablet was subsequently tightened for collective row overflow, then all three notice screens were tightened after repeated fresh acquire/render measurements of the independent offset-mask HUG repair; see docs/notice-layout-divergence.md. About was subsequently tightened after repeated fresh acquire/render measurements of the cropped-node-export correction; see docs/about-mobile-composition.md. Values are percentages; render.mjs fails above each value plus tolerance. The unchanged popup-answer entries are historical plugin-answer comparisons and were not remeasured in this task. Keyframes and notice desktop were subsequently tightened after repeated measurements of the lone-child SPACE_BETWEEN correction; see docs/keyframes-static-alignment.md.", "tolerance": 0.05, "screens": { - "popup-422-5682": 3.64, - "popup-422-5705": 2.06, - "popup-422-5728": 0.85, + "popup-422-5682": 3.58, + "popup-422-5705": 2.02, + "popup-422-5728": 0.84, "popup-answer-422-5682": 12.02, "popup-answer-422-5705": 7.14, "popup-answer-422-5728": 21.06, From 9b6d179e454787d9d6da0fb462a9d6b0a439d42e Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 14 Sep 2026 01:15:47 +0900 Subject: [PATCH 3/5] fix(figma): deliver bridge assets without remote file writer --- .../changepack_log_bridge_asset_delivery.json | 8 ++ crates/devup-mcp-figma/src/scripts/assets.js | 19 ++- .../tests/asset_script_transport.rs | 136 ++++++++++++++++++ docs/bridge-asset-delivery.md | 111 ++++++++++++++ plugin/dist/code.js | 2 +- 5 files changed, 270 insertions(+), 6 deletions(-) create mode 100644 .changepacks/changepack_log_bridge_asset_delivery.json create mode 100644 crates/devup-mcp-figma/tests/asset_script_transport.rs create mode 100644 docs/bridge-asset-delivery.md diff --git a/.changepacks/changepack_log_bridge_asset_delivery.json b/.changepacks/changepack_log_bridge_asset_delivery.json new file mode 100644 index 0000000..7edf42a --- /dev/null +++ b/.changepacks/changepack_log_bridge_asset_delivery.json @@ -0,0 +1,8 @@ +{ + "changes": { + "crates/devup-mcp-figma/Cargo.toml": "Patch", + "crates/devup-mcp/Cargo.toml": "Patch" + }, + "note": "Return native bridge asset bytes without the remote MCP file writer. The native Plugin API has no figma.io, so successful small PNG and SVG exports were converted to DEVUP_ASSET_EXPORT_FAILED when the script tried to write an attachment. The script now carries bounded binary bytes and MIME directly in the bridge JSON response, while preserving remote attachment and fragment limits and existing hash validation. The plugin bundle is rebuilt from the same source. This fixes delivery, not whole-node versus isolated-fill composition; the about hero contract and the outstanding live-pixel validation are documented separately, and no visual improvement or eleven-second latency improvement is claimed.", + "date": "2026-09-14T01:13:00+09:00" +} diff --git a/crates/devup-mcp-figma/src/scripts/assets.js b/crates/devup-mcp-figma/src/scripts/assets.js index 12757f8..b879bf8 100644 --- a/crates/devup-mcp-figma/src/scripts/assets.js +++ b/crates/devup-mcp-figma/src/scripts/assets.js @@ -64,6 +64,11 @@ try { return failed("DEVUP_ASSET_RESPONSE_TOO_LARGE"); } const sha256 = devupSha256(bytes); + // figma.io is an extension of the remote MCP, not the native Plugin API. + // The bridge returns JSON over its local socket and has no attachment + // writer. Carry its bounded bytes inline, without exporting again for each + // fragment; the Rust decoder still validates length, MIME type and hash. + const hasFileWriter = figma.io && typeof figma.io.write === "function"; // A PNG past what one attachment carries is not written here either. // Figma's remote MCP returns a written PNG as an attachment only up to // about a megabyte once base64-encoded: a 665 KB photograph came back, a @@ -71,7 +76,7 @@ try { // devup-ui landing page's hero. Past 768 KiB, which is exactly one MiB // encoded, it is announced and read back in fragments like a large SVG. const pngTooLargeToAttach = format === "PNG" && bytes.length > 768 * 1024; - if ((svgText !== null && bytes.length > 12 * 1024) || pngTooLargeToAttach) { + if (hasFileWriter && ((svgText !== null && bytes.length > 12 * 1024) || pngTooLargeToAttach)) { // An SVG past what one text response holds is not written here at all: // it is announced with its length and hash, and read back in fragments // through the large-value script, which re-exports it and slices — the @@ -94,7 +99,9 @@ try { errorCode: null, }; } - figma.io.write(`devup-asset-${options.assetId.replace(/[^A-Za-z0-9_-]/g, "_")}.${String(options.format).toLowerCase()}`, bytes); + if (hasFileWriter) { + figma.io.write(`devup-asset-${options.assetId.replace(/[^A-Za-z0-9_-]/g, "_")}.${String(options.format).toLowerCase()}`, bytes); + } return { kind: "devupAssetExport", fileKey: figma.fileKey || "", @@ -108,9 +115,11 @@ try { status: "exported", byteLength: bytes.length, sha256, - // Present only for SVG. `mimeType` is what lets the Rust side recognise - // this as the payload rather than as ordinary descriptor prose. - mimeType: svgText === null ? null : "image/svg+xml", + // MIME identifies inline bridge bytes or remote SVG text as a payload. + mimeType: !hasFileWriter + ? { PNG: "image/png", JPG: "image/jpeg", SVG: "image/svg+xml", PDF: "application/pdf" }[format] + : svgText === null ? null : "image/svg+xml", + ...(!hasFileWriter && svgText === null ? { data: figma.base64Encode(bytes) } : {}), text: svgText, errorCode: null, }; diff --git a/crates/devup-mcp-figma/tests/asset_script_transport.rs b/crates/devup-mcp-figma/tests/asset_script_transport.rs new file mode 100644 index 0000000..ccb0e5a --- /dev/null +++ b/crates/devup-mcp-figma/tests/asset_script_transport.rs @@ -0,0 +1,136 @@ +use std::io::Write; +use std::process::{Command, Stdio}; + +use base64::{Engine as _, engine::general_purpose::STANDARD}; +use devup_mcp_figma::{ + AssetExportOutcome, AssetFormat, AssetRequest, AssetStatus, ReadToolCall, UpstreamResult, + asset_export_from_result, +}; +use serde_json::{Value, json}; + +fn execute( + format: AssetFormat, + length: usize, + writer: bool, + export_fails: bool, +) -> (AssetRequest, Value) { + let request = AssetRequest { + asset_id: "1:2:node".to_owned(), + node_id: "1:2".to_owned(), + field: "node".to_owned(), + image_hash: None, + format, + scale: 2, + }; + let call = ReadToolCall::asset_export("fixture", Some("v1".to_owned()), request.clone()); + let code = call.arguments()["code"].as_str().unwrap().to_owned(); + let input = + json!({"code": code, "length": length, "writer": writer, "exportFails": export_fails}); + // The native Plugin API provides base64Encode, but no figma.io. Keep the + // source bytes deterministic and exercise the actual compiled export script + // and Rust response decoder, including JSON nested in the bridge envelope. + let js = r#" +const input = JSON.parse(require('node:fs').readFileSync(0, 'utf8')); +const bytes = Uint8Array.from({length: input.length}, (_, i) => 65 + i % 26); +let exports = 0, writes = 0; +const figma = { + fileKey: 'fixture', + base64Encode: value => Buffer.from(value).toString('base64'), + getNodeByIdAsync: async () => ({exportAsync: async settings => { + exports++; + if (input.exportFails) throw new Error('renderer failed'); + return settings.format === 'SVG_STRING' ? Buffer.from(bytes).toString() : bytes; + }}), +}; +if (input.writer) figma.io = {write: () => { writes++; }}; +const AsyncFunction = Object.getPrototypeOf(async function(){}).constructor; +new AsyncFunction('figma', input.code)(figma).then(data => { + process.stdout.write(JSON.stringify({exports, writes, data})); +}).catch(error => { console.error(error); process.exitCode = 1; }); +"#; + let mut child = Command::new("node") + .args(["-e", js]) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn() + .expect("Node is required to execute the asset script contract"); + child + .stdin + .take() + .unwrap() + .write_all(input.to_string().as_bytes()) + .unwrap(); + let output = child.wait_with_output().unwrap(); + assert!( + output.status.success(), + "{}", + String::from_utf8_lossy(&output.stderr) + ); + (request, serde_json::from_slice(&output.stdout).unwrap()) +} + +#[test] +fn native_plugin_exports_without_a_remote_file_writer() { + for (format, length) in [ + (AssetFormat::Png, 7), + (AssetFormat::Png, 800_000), + (AssetFormat::Jpg, 257), + (AssetFormat::Pdf, 258), + (AssetFormat::Svg, 11), + (AssetFormat::Svg, 13_000), + ] { + let (request, result) = execute(format, length, false, false); + assert_eq!(result["exports"], 1); + assert_eq!(result["writes"], 0); + let response = UpstreamResult { + raw: json!({"content": [{"type": "text", "text": result["data"].to_string()}]}), + }; + let AssetExportOutcome::Entry(asset) = + asset_export_from_result(&response, "fixture", Some("v1"), &request).unwrap() + else { + panic!("a bridge response can carry the bounded bytes without re-exporting fragments") + }; + assert_eq!( + asset.status, + AssetStatus::Exported, + "{format:?}/{length}: {result}" + ); + let expected: Vec = (0..length).map(|i| 65 + (i % 26) as u8).collect(); + assert_eq!( + STANDARD.decode(asset.data_base64.unwrap()).unwrap(), + expected + ); + assert_eq!(asset.byte_length, Some(length)); + assert_eq!(asset.mime_type.as_deref(), Some(format.mime_type())); + } +} + +#[test] +fn remote_asset_delivery_retains_attachment_and_fragment_limits() { + for (format, length, status, writes) in [ + (AssetFormat::Png, 7, "exported", 1), + (AssetFormat::Png, 800_000, "chunked", 0), + (AssetFormat::Svg, 11, "exported", 1), + (AssetFormat::Svg, 13_000, "chunked", 0), + ] { + let (_, result) = execute(format, length, true, false); + assert_eq!(result["data"]["status"], status); + assert_eq!(result["exports"], 1); + assert_eq!(result["writes"], writes); + } +} + +#[test] +fn bridge_does_not_hide_export_failure_or_bypass_byte_limit() { + for (length, fails, error) in [ + (3, true, "DEVUP_ASSET_EXPORT_FAILED"), + (0, false, "DEVUP_ASSET_RESPONSE_TOO_LARGE"), + (8 * 1024 * 1024 + 1, false, "DEVUP_ASSET_RESPONSE_TOO_LARGE"), + ] { + let (_, result) = execute(AssetFormat::Png, length, false, fails); + assert_eq!(result["data"]["status"], "failed"); + assert_eq!(result["data"]["errorCode"], error); + assert_eq!(result["writes"], 0); + } +} diff --git a/docs/bridge-asset-delivery.md b/docs/bridge-asset-delivery.md new file mode 100644 index 0000000..2a2f094 --- /dev/null +++ b/docs/bridge-asset-delivery.md @@ -0,0 +1,111 @@ +# Native bridge asset delivery + +The native bridge runs the compiled `assets.js` against Figma's standard +Plugin API, which has `base64Encode` but no `figma.io`. The export script used +the remote MCP's `figma.io.write` extension unconditionally on its attachment +path. A successful `node.exportAsync` was therefore followed by an exception +and returned as `DEVUP_ASSET_EXPORT_FAILED`. Small SVG exports also failed at +this write even though their text was already available for inline delivery. + +This is a proven explanation for failures **after a successful export** in +the bridge PR's ["Still broken" lead](https://github.com/dev-five-git/devup-mcp/pull/50). +It is not a reproduced explanation of the reported approximately 11-second +latency: no live bridge timing is claimed. Unlike the variable defect, the +asset script performs one node lookup and one export, not many individual +variable lookups. PNGs/SVGs already large enough to take the pre-existing +fragment path returned before the missing writer and had a different path. + +## Correction + +`assets.js` checks the writer capability after producing and validating its +bounded bytes. With a remote file writer, attachment delivery and its existing +PNG/SVG fragment thresholds remain unchanged. Without one, the script returns +the requested MIME and base64 bytes directly in the bridge's JSON response; +SVG remains text. The native bridge can carry these bounded bytes in one +response, so it no longer needs to re-export a large node for every fragment. + +The existing 8 MiB export limit, empty-result rejection, export failures, +identity checks, MIME/byte-length/SHA-256 validation and Rust delivery remain +in place. The largest base64 response is approximately 10.67 MiB before its +small JSON wrapper. This does not change what pixels are exported or how +codegen composes them, and introduces no new provenance/resolution claim. + +The runtime change is confined to the export script and rebuilt +`plugin/dist/code.js`, with a new integration test and required changepack. +No shared codegen file, forbidden file, corpus golden, +manifest checksum, Korean wrapping rule or threshold changes. + +## Test-first evidence + +The new `asset_script_transport` integration test executes the actual compiled +script in Node with the native API surface and passes its bridge-shaped JSON +through the real Rust asset decoder. Before implementation: + +```text +native_plugin_exports_without_a_remote_file_writer ... FAILED +remote_asset_delivery_retains_attachment_and_fragment_limits ... ok +bridge_does_not_hide_export_failure_or_bypass_byte_limit ... ok +test result: FAILED. 2 passed; 1 failed +``` + +The failing assertion recorded `Png/7`, `exports:1`, `writes:0`, +`status:"failed"`, `DEVUP_ASSET_EXPORT_FAILED` where `Exported` was required. +After implementation all three tests pass. They exercise small and 800,000-byte +PNG, JPG, PDF, small and 13,000-byte SVG, byte-for-byte decoding, MIME identity, +one export per result, remote writer/fragment behavior, renderer rejection, +zero bytes and the unchanged 8 MiB ceiling. Existing decoder tests retain hash +and length rejection coverage. + +The generated plugin's `assets` function was also executed without a writer: +bytes `[1,2,3]` arrived as `AQID`, `image/png`, length 3 and SHA-256 +`039058c6f2c0cb492c533b0a4d14ef77cc0f78abccced5287d84a1a2011cfb81`. +`npm install` and `npm run build` regenerated the committed bundle from the +same source used by Rust. This is an API-surface/decoder integration test, +not a live native-Figma export or a latency measurement. + +## Pixel scope + +[The isolated-fill investigation](isolated-fill-export-contract.md) separately +defines the missing representation, validates the existing crops and proves +the hero composite includes other paints and children. Authentication prevented +obtaining original/isolated pixels through the available Figma connector, so +there is no hero pixel fix in this transport correction. + +Both own baseline render runs measure 5.4317833026 / 2.9337565805 / +1.7682713195 percent for about mobile/tablet/desktop. Reacquisition uses the +actual candidate binary identity, while the captured image bytes stay the same; +that is suitable for verifying unchanged generation but is not evidence of +live bridge delivery. Final repeated measurements and gate outcomes are recorded +in [isolated-fill-export-evidence.json](isolated-fill-export-evidence.json). + +The final own candidate binary is SHA-256 +`c3a5855d2fd50dc07ba712662378ff932c9d0657c9d20a4337d405579ef7fe60`. +After rebuilding, all three about screens were reacquired with that exact +binary, and two valid render runs repeated the baseline metrics exactly. +Every candidate actual PNG is **byte-identical** to the own baseline; all +acquisition input hashes and rendered dimensions also agree. The measured +delta is **0 pixels / 0pp** on each screen. No threshold is adjusted. + +## Full gate + +| Command | Result | +| --- | --- | +| `cargo fmt --all -- --check` | Pass | +| `cargo clippy --locked --workspace --all-targets --all-features -j 2 -- -D warnings` | Pass, zero warnings | +| `cargo test --workspace -j 2 --no-fail-fast` | 1,115 passed, 0 failed, 2 ignored | +| `cargo insta test --workspace --all-features --check` | 1,115 passed, 0 failed, 2 ignored; no snapshots to review | +| `cargo test --locked -p devup-mcp --test stdio_smoke -j 2` | 2 passed, 0 failed | +| Plugin build, repeated | Pass; byte-identical `dist/code.js` | + +All 268 plugin goldens and their manifest remain unchanged; corpus consistency +and `korean_characters_keep_words_whole` pass. The repeated plugin bundle hash +is `b1b59a59e6a1a3b2161b307d96a61f767da8c825210681e1b38b1598fdbd77b6`. +The native API surface was checked against the installed official +`@figma/plugin-typings` version 1.138.0. + +All Cargo commands used this worktree's own target, two jobs, +`CARGO_PROFILE_DEV_DEBUG=0`, `CARGO_PROFILE_TEST_DEBUG=0` and +`CARGO_INCREMENTAL=0`; `CARGO_TARGET_DIR` was never set. Ordinary MSVC builds +retain the pre-existing localized library-creation linker messages. Clippy's +required command reports zero warnings. Raw logs are under the local ignored +`harness/render/out/w24-*` paths, with their hashes in the evidence JSON. diff --git a/plugin/dist/code.js b/plugin/dist/code.js index 5e6b0a2..27e89e5 100644 --- a/plugin/dist/code.js +++ b/plugin/dist/code.js @@ -1 +1 @@ -(()=>{"use strict";var e={},t={};function r(n){var i=t[n];if(void 0!==i)return i.exports;var a=t[n]={exports:{}};return e[n](a,a.exports,r),a.exports}r.rv=()=>"1.7.12",r.ruid="bundler=rspack@1.7.12";let n={assets:async function(e){let t=e.asset;function r(e){return{kind:"devupAssetExport",fileKey:figma.fileKey||"",version:t.version,assetId:t.assetId,nodeId:t.nodeId,field:t.field,imageHash:t.imageHash,format:t.format,scale:t.scale,status:"failed",byteLength:null,sha256:null,errorCode:e}}try{let e=await figma.getNodeByIdAsync(t.nodeId);if(!e||"function"!=typeof e.exportAsync)return r("DEVUP_ASSET_UNSUPPORTED_BY_UPSTREAM");if("string"==typeof t.field&&t.field.startsWith("fills/")){let n=Number(t.field.slice(6)),i="fills"in e&&Array.isArray(e.fills)?e.fills:[],a=Number.isInteger(n)?i[n]:null,l=a&&"IMAGE"===a.type?a.imageHash||a.imageRef:null;if(!a||l!==t.imageHash)return r("DEVUP_ASSET_SOURCE_CHANGED")}else if("node"!==t.field)return r("DEVUP_ASSET_FIELD_UNSUPPORTED");let n=String(t.format||"").toUpperCase();if(!["PNG","JPG","SVG","PDF"].includes(n))return r("DEVUP_ASSET_FORMAT_UNSUPPORTED");let i=Math.min(4,Math.max(1,Math.floor(Number(t.scale)||1))),a="SVG"===n,l={format:a?"SVG_STRING":n};("PNG"===n||"JPG"===n)&&(l.constraint={type:"SCALE",value:i});let o=await e.exportAsync(l),s=a&&"string"==typeof o?o:null,d=null===s?o instanceof Uint8Array?o:new Uint8Array(o):function(e){let t=[];for(let r=0;r=55296&&n<=56319){let t=r+1=56320&&t<=57343?(n=65536+(n-55296<<10)+(t-56320),r+=1):n=65533}else n>=56320&&n<=57343&&(n=65533);n<128?t.push(n):n<2048?t.push(192|n>>6,128|63&n):n<65536?t.push(224|n>>12,128|n>>6&63,128|63&n):t.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n)}return new Uint8Array(t)}(s);if(0===d.length||d.length>8388608)return r("DEVUP_ASSET_RESPONSE_TOO_LARGE");let f=function(e){let t=[0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,0xe49b69c1,0xefbe4786,0xfc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x6ca6351,0x14292967,0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2],r=64*Math.ceil((e.length+9)/64),n=new Uint8Array(r);n.set(e),n[e.length]=128;let i=8*e.length;for(let e=0;e<8;e+=1)n[r-1-e]=255&Math.floor(i/2**(8*e));let a=[0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19],l=(e,t)=>e>>>t|e<<32-t;for(let e=0;e>>3,n=l(r[e-2],17)^l(r[e-2],19)^r[e-2]>>>10;r[e]=r[e-16]+t+r[e-7]+n>>>0}let[i,o,s,d,f,u,c,y]=a;for(let e=0;e<64;e+=1){let n=l(f,6)^l(f,11)^l(f,25),a=y+n+(f&u^~f&c)+t[e]+r[e]>>>0,h=(l(i,2)^l(i,13)^l(i,22))+(i&o^i&s^o&s)>>>0;y=c,c=u,u=f,f=d+a>>>0,d=s,s=o,o=i,i=a+h>>>0}for(let[e,t]of[i,o,s,d,f,u,c,y].entries())a[e]=a[e]+t>>>0}return a.map(e=>e.toString(16).padStart(8,"0")).join("")}(d),u="PNG"===n&&d.length>786432;if(null!==s&&d.length>12288||u)return{kind:"devupAssetExport",fileKey:figma.fileKey||"",version:t.version,assetId:t.assetId,nodeId:t.nodeId,field:t.field,imageHash:t.imageHash,format:t.format,scale:i,status:"chunked",byteLength:d.length,sha256:f,cursor:{nextOffset:0,maxChunkBytes:12288},errorCode:null};return figma.io.write(`devup-asset-${t.assetId.replace(/[^A-Za-z0-9_-]/g,"_")}.${String(t.format).toLowerCase()}`,d),{kind:"devupAssetExport",fileKey:figma.fileKey||"",version:t.version,assetId:t.assetId,nodeId:t.nodeId,field:t.field,imageHash:t.imageHash,format:t.format,scale:i,status:"exported",byteLength:d.length,sha256:f,mimeType:null===s?null:"image/svg+xml",text:s,errorCode:null}}catch(e){return r("DEVUP_ASSET_EXPORT_FAILED")}},explore:async function(e){let t=await figma.getNodeByIdAsync(e.nodeId);if(!t)throw Error("DEVUP_NODE_NOT_FOUND");let r=e.explore,n=Math.max(20,Math.min(400,Number.isInteger(r.projectionLimit)?r.projectionLimit:200)),i=Math.max(0,Math.min(500,Number.isInteger(r.textPreviewLimit)?r.textPreviewLimit:160));function a(e){return"string"==typeof e?e.slice(0,240):""}let l=t,o="SECTION"===t.type?t:null;for(;l.parent&&"PAGE"!==l.parent.type;)l=l.parent,o||"SECTION"!==l.type||(o=l);let s="PAGE"===t.type?t:l.parent;if(!s||"PAGE"!==s.type)throw Error("DEVUP_PAGE_NOT_FOUND");function d(e){let t=e.absoluteBoundingBox||{x:"number"==typeof e.x?e.x:0,y:"number"==typeof e.y?e.y:0,width:"number"==typeof e.width?e.width:0,height:"number"==typeof e.height?e.height:0};return[t.x,t.y,t.width,t.height].every(Number.isFinite)?{x:t.x,y:t.y,width:t.width,height:t.height}:null}function f(e){let t=d(e);return t&&["FRAME","COMPONENT","INSTANCE","COMPONENT_SET"].includes(e.type)&&t.width>=240&&t.width<=1800&&t.height>=300&&t.height<=2e3&&t.width/Math.max(1,t.height)>=.25&&t.width/Math.max(1,t.height)<=2.5}function u(e){let t=[],r=e;for(;r&&"DOCUMENT"!==r.type&&t.length<12;){let e=a(r.name);e&&t.push(e),r=r.parent}return t.reverse()}await figma.setCurrentPageAsync(s);let c=!f(t)&&o?o:l,y=d(c)||d(t);if(!y)throw Error("DEVUP_NODE_BOUNDS_UNAVAILABLE");let h="children"in s?s.children:[],p=h.map((e,t)=>({node:e,pageChildIndex:t,bounds:d(e)})).filter(e=>e.bounds).filter(e=>{var t;return e.node.id===c.id||e.bounds.y>=y.y-240&&e.bounds.y<=y.y+12e3&&(t=e.bounds,Math.min(t.x+t.width,y.x+y.width)-Math.max(t.x,y.x)>0)}).sort((e,t)=>e.bounds.y-t.bounds.y||e.bounds.x-t.bounds.x||e.node.id.localeCompare(t.node.id)),g="SECTION"===c.type?p.filter(e=>e.node.id===c.id):p.slice(0,n),m=new Map(g.map(e=>[e.node.id,e]));m.has(l.id)||m.set(l.id,{node:l,pageChildIndex:-1,bounds:d(l)}),m.has(c.id)||m.set(c.id,{node:c,pageChildIndex:-1,bounds:d(c)}),m.has(t.id)||m.set(t.id,{node:t,pageChildIndex:-1,bounds:d(t)});let b=t.parent;for(;b&&"PAGE"!==b.type&&(m.has(b.id)||m.set(b.id,{node:b,pageChildIndex:-1,bounds:d(b)}),b.id!==c.id);)b=b.parent;if("children"in c)for(let e of c.children.slice(0,n))m.has(e.id)||m.set(e.id,{node:e,pageChildIndex:-1,bounds:d(e)});let x="SECTION"===c.type&&"children"in c&&c.children.length>n;if("SECTION"===c.type&&"children"in c){let e=8*n,t=c.children.filter(e=>!f(e)).map(e=>({node:e,ancestors:[]})),r=0;for(;t.length&&r!m.has(e.id));if(m.size+t.length>n+2){x=!0;continue}for(let e of t)m.set(e.id,{node:e,pageChildIndex:-1,bounds:d(e)});continue}if("children"in e)for(let r of e.children)t.push({node:r,ancestors:[...i,e]})}x||=t.length>0}let E=[...m.values()].filter(e=>e.bounds).slice(0,n+2).map(({node:e,pageChildIndex:t,bounds:r})=>({id:e.id,type:e.type,fields:{name:a(e.name),parentId:e.parent&&"DOCUMENT"!==e.parent.type?e.parent.id:null,childrenIds:[],x:r.x,y:r.y,width:r.width,height:r.height,childCount:"children"in e?e.children.length:0,textPreview:"",pageChildIndex:t>=0?t:null,visible:!("visible"in e)||!1!==e.visible,breadcrumb:u(e)},extra:{},fieldErrors:{}})),S=E.reduce((e,t)=>{let r=t.fields;return e?{x:Math.min(e.x,r.x),y:Math.min(e.y,r.y),right:Math.max(e.right,r.x+r.width),bottom:Math.max(e.bottom,r.y+r.height)}:{x:r.x,y:r.y,right:r.x+r.width,bottom:r.y+r.height}},null)||{x:0,y:0,right:0,bottom:0},I="SECTION"!==c.type&&p.length>g.length||m.size>n+2||x,A={id:s.id,type:s.type,fields:{name:a(s.name),parentId:null,childrenIds:[],x:S.x,y:S.y,width:S.right-S.x,height:S.bottom-S.y,childCount:h.length,textPreview:"",projectionTruncated:I,visible:!0,breadcrumb:u(s),pageChildIndex:null},extra:{},fieldErrors:{}},N={fileKey:figma.fileKey||"",version:null,rootIds:[s.id],nodes:[A,...E.filter(e=>e.id!==s.id)],diagnostics:[]},w=new Set([s.id,l.id,c.id,t.id]);for(;JSON.stringify(N).length>14e3;){let e=N.nodes.length-1;for(;e>=0&&w.has(N.nodes[e].id);)e-=1;if(e<0)break;N.nodes.splice(e,1),A.fields.projectionTruncated=!0}if(JSON.stringify(N).length>14e3&&(N.nodes=N.nodes.filter(e=>w.has(e.id)).map(e=>({...e,fields:{...e.fields,name:a(e.fields.name).slice(0,80),textPreview:"",breadcrumb:e.fields.breadcrumb.slice(-4).map(e=>e.slice(0,80)),projectionTruncated:e.id===s.id||e.fields.projectionTruncated}}))),JSON.stringify(N).length>14e3)throw Error("DEVUP_EXPLORE_PROJECTION_TOO_LARGE");let O=14e3-JSON.stringify(N).length;if(i>0&&O>0){let e=N.nodes.filter(e=>m.get(e.id)&&e.id!==s.id),t=e.length;for(let r of e){let e=Math.floor(O/t);if(t-=1,e<=0)continue;let n="",a=0;for(let t of function(e){if(0===i)return"";let t=[],r=[e],n=0;for(;r.length&&n<80&&t.join(" ").lengthe)break;n+=t,a+=r}r.fields.textPreview=n,O-=a}}return N},fastSnapshot:async function(e){let t=e.rootIds;if(!Array.isArray(t)||0===t.length)throw Error("DEVUP_ROOTS_INVALID");let r=await Promise.all(t.map(e=>figma.getNodeByIdAsync(e)));if(r.some(e=>!e))throw Error("DEVUP_NODE_NOT_FOUND");if(1===r.length&&"SECTION"===r[0].type)throw Error("DEVUP_TARGET_IS_SECTION");let n=["mobile","tablet","desktop"],i=e=>n.indexOf(String(e.name||"").trim().toLowerCase());if(1===r.length&&i(r[0])>=0){let e=r[0].parent;if(e&&"SECTION"===e.type&&"children"in e){let t=e.children.filter(e=>e.id===r[0].id||i(e)>=0).filter(e=>!1!==e.visible);t.length>1&&(r.length=0,r.push(...t))}}if(1===t.length){let e=[],t=new Set(r.map(e=>e.id)),n=[],i=e=>{if("reactions"in e&&Array.isArray(e.reactions)){for(let r of e.reactions)if(r&&r.trigger&&"AFTER_TIMEOUT"===r.trigger.type)for(let e of r.actions||[])e&&"NODE"===e.type&&e.transition&&"SMART_ANIMATE"===e.transition.type&&"string"==typeof e.destinationId&&!t.has(e.destinationId)&&(t.add(e.destinationId),n.push(e.destinationId));if("children"in e)for(let t of e.children)i(t)}};for(let e of r)i(e);for(;n.length>0;){let t=n.shift(),r=await figma.getNodeByIdAsync(t);r&&"DOCUMENT"!==r.type&&"PAGE"!==r.type&&(e.push(r),i(r))}r.push(...e)}let a=e.nodeId,l=["absoluteBoundingBox","absoluteRenderBounds","arcData","backgroundStyleId","blendMode","bottomLeftRadius","bottomRightRadius","boundVariables","characters","clipsContent","componentProperties","componentPropertyDefinitions","componentPropertyReferences","constraints","cornerRadius","counterAxisAlignItems","dashPattern","defaultVariant","effectStyleId","effects","fillStyleId","fills","fontName","fontSize","gridColumnAnchorIndex","gridColumnCount","gridColumnGap","gridColumnSizes","gridColumnSpan","gridRowAnchorIndex","gridRowCount","gridRowGap","gridRowSizes","gridRowSpan","gridStyleId","height","inferredAutoLayout","isAsset","isMask","itemSpacing","layoutGrow","layoutMode","layoutWrap","layoutPositioning","layoutSizingHorizontal","layoutSizingVertical","letterSpacing","lineHeight","maxHeight","maxLines","maxWidth","minHeight","minWidth","name","opacity","overflowDirection","paddingBottom","paddingLeft","paddingRight","paddingTop","primaryAxisAlignItems","reactions","rotation","strokeAlign","strokeBottomWeight","strokeLeftWeight","strokeRightWeight","strokeStyleId","strokeTopWeight","strokeWeight","strokes","targetAspectRatio","textAlignHorizontal","textAlignVertical","textAutoResize","textCase","textDecoration","textStyleId","textTruncation","topLeftRadius","topRightRadius","variantProperties","visible","width","x","y"],o=["fontName","fontWeight","fontSize","textDecoration","textCase","lineHeight","letterSpacing","fills","textStyleId","fillStyleId","listOptions","indentation","hyperlink"],s=e.snapshot,d=Math.max(0,Math.floor(Number(s.offset)||0)),f=Math.max(8192,Math.floor(Number(s.maxEnvelopeBytes)||19456)),u=Math.min(s.maxEnvelopeBytes?f-1024:18e3,Math.max(4096,Math.floor(Number(s.maxPayloadBytes)||15e3))),c=new Set(["backgroundStyleId","effectStyleId","fillStyleId","gridStyleId","strokeStyleId","textStyleId"]),y=new Set(["maxWidth","maxHeight","absoluteRenderBounds"]),h=new Map([["rotation",0],["cornerRadius",0],["isAsset",!1],["isMask",!1],["clipsContent",!1],["blendMode","PASS_THROUGH"],["strokeAlign","INSIDE"],["textCase","ORIGINAL"],["textDecoration","NONE"],["textAlignHorizontal","LEFT"],["textAlignVertical","TOP"],["counterAxisAlignItems","MIN"],["primaryAxisAlignItems","MIN"],["gridColumnCount",0],["gridRowCount",0],["gridColumnGap",0],["gridRowGap",0],["gridColumnAnchorIndex",-1],["gridRowAnchorIndex",-1],["gridColumnSpan",1],["gridRowSpan",1]]),p=new Set(["start","end","characters","fontWeight","textStyleId","fillStyleId","listOptions","indentation","hyperlink"]),g=new Set(["parent","children","consumers"]);function m(e,t=!1,r=new WeakSet,n=0){let i;if(null===e||["string","number","boolean"].includes(typeof e))return e;if(void 0===e)return{$undefined:!0};if("bigint"==typeof e)return{$bigint:e.toString()};if(["function","symbol"].includes(typeof e))return{$unsupported:typeof e};if(n>12)return{$truncated:"max-depth"};if("object"==typeof e&&"parent"in e&&"string"==typeof e.id&&"string"==typeof e.type)return{$nodeId:e.id,$nodeType:e.type};if(Array.isArray(e))return e.map(e=>m(e,t,r,n+1));if(ArrayBuffer.isView(e))return{$binary:e.constructor.name,byteLength:e.byteLength};if(e instanceof ArrayBuffer)return{$binary:"ArrayBuffer",byteLength:e.byteLength};if(r.has(e))return{$circular:!0};if(r.add(e),t){let t=new Set(Object.keys(e)),r=e;for(;r&&r!==Object.prototype;){for(let e of Object.getOwnPropertyNames(r))t.add(e);r=Object.getPrototypeOf(r)}i=[...t].sort().filter(e=>!e.startsWith("_")&&!g.has(e))}else i=Object.keys(e).sort();let a={};for(let l of i)try{let i=m(e[l],t,r,n+1);i&&"function"===i.$unsupported||(a[l]=i)}catch(e){a[l]=t?{$error:"unavailable"}:{$error:String(e&&e.message?e.message:e)}}return r.delete(e),a}let b=[],x=[...r],E=new Set;for(let e=0;e=b.length&&b.length>0)throw Error("DEVUP_SNAPSHOT_RANGE_INVALID");function S(e){let t=0;for(let r=0;r=55296&&n<=56319&&r+1({id:e,styleType:t})).sort((e,t)=>e.id.localeCompare(t.id)),a=await Promise.all([...n.map(async e=>{try{let t=await figma.variables.getVariableByIdAsync(e);return t?{kind:"variable",value:m(t,!0),collectionId:t.variableCollectionId}:{kind:"unresolved",value:{id:e,kind:"variable",reason:"notFoundOrUnavailable"}}}catch(t){return{kind:"unresolved",value:{id:e,kind:"variable",reason:"notFoundOrUnavailable"}}}}),...i.map(async({id:e,styleType:t})=>{try{let r=await figma.getStyleByIdAsync(e);if(!r)return{kind:"unresolved",value:{id:e,kind:"style",reason:"notFoundOrUnavailable"}};return{kind:"style",value:{...m(r,!0),styleType:t,value:m("PAINT"===t?r.paints:"EFFECT"===t?r.effects:"GRID"===t?r.layoutGrids:r,!0)}}}catch(t){return{kind:"unresolved",value:{id:e,kind:"style",reason:"notFoundOrUnavailable"}}}})]),l=[...new Set(a.filter(e=>"variable"===e.kind&&e.collectionId).map(e=>e.collectionId))].sort(),o=(await Promise.all(l.map(async e=>{try{let t=await figma.variables.getVariableCollectionByIdAsync(e);return t?m(t,!0):null}catch(e){return null}}))).filter(e=>null!==e),s=a.filter(e=>"variable"===e.kind).map(e=>e.value),d=a.filter(e=>"style"===e.kind).map(e=>e.value),f=a.filter(e=>"unresolved"===e.kind).map(e=>e.value);return{collections:o,variables:s,styles:d,usedRemoteVariables:s.filter(e=>!0===e.remote),usedVariableIds:n,usedStyleIds:i.map(e=>e.id),localComplete:!1,usedRemoteComplete:0===f.length,unresolved:f,$variableRefCount:n.length,$styleRefCount:i.length}}let A=u-1024,N=null;for(let e=0;e<5;e+=1){let{pageNodes:e,packedBytes:t}=function(e){let t=[],r=2;for(let n=d;ne.id):[];for(let i of(n.length>0&&(t.childrenIds=n),l)){let n;try{if(!(i in e)){"overflowDirection"===i&&["FRAME","COMPONENT","INSTANCE","COMPONENT_SET"].includes(e.type)&&(t[i]=null);continue}if(n=e[i],"function"==typeof n)continue;let r=m(n);if("overflowDirection"===i&&null==n){t[i]=null;continue}(null===r?!y.has(i):Array.isArray(r)?0===r.length:"object"==typeof r?0===Object.keys(r).length:!!(""===r&&c.has(i))||h.has(i)&&h.get(i)===r)||(t[i]=r)}catch(e){r[i]=String(e&&e.message?e.message:e)}}if("TEXT"===e.type&&"function"==typeof e.getStyledTextSegments)try{let r=m(e.getStyledTextSegments(o));if(1===r.length){let e=r[0];for(let t of Object.keys(e))p.has(t)||delete e[t]}r.length>0&&(t.styledTextSegments=r)}catch(e){r.styledTextSegments=String(e&&e.message?e.message:e)}let i={id:e.id,type:e.type,fields:t};return Object.keys(r).length>0&&(i.fieldErrors=r),i}(b[n]),a=S(JSON.stringify(i))+ +!!t.length;if(t.length&&r+a>e)break;t.push(i),r+=a}return{pageNodes:t,packedBytes:r}}(A);if(0===e.length)throw Error("DEVUP_SNAPSHOT_RANGE_INVALID");let n=function(e,t){let n=Math.min(b.length,d+e.length),{$variableRefCount:i,$styleRefCount:l,...o}=t,s=[...e,{id:"__DEVUP_SNAPSHOT_CURSOR__",type:"DEVUP_INTERNAL",fields:{offset:d,nextOffset:n,complete:n>=b.length,totalNodes:b.length},extra:{},fieldErrors:{}}],f={kind:"devupFastSnapshotEnvelope",schemaVersion:1,source:{fileKey:figma.fileKey||"",rootId:a},snapshot:{fileKey:figma.fileKey||"",version:null,rootIds:r.map(e=>e.id),nodes:s,diagnostics:[]},resources:o,integrity:{nodeCount:s.length,variableRefCount:i,styleRefCount:l,utf8Bytes:0}},u=0;for(let e=0;e<8&&(u=S(JSON.stringify(f)),f.integrity.utf8Bytes!==u);e+=1)f.integrity.utf8Bytes=u;if(f.integrity.utf8Bytes!==S(JSON.stringify(f)))throw Error("DEVUP_ENVELOPE_LENGTH_UNSTABLE");return{envelope:f,bytes:u}}(e,await I(e));if(n.bytes<=f){N=n;break}if(1===e.length)throw Error("DEVUP_ENVELOPE_TOO_LARGE");A=Math.max(1,Math.min(A-1,t-(n.bytes-f)-256))}if(!N)throw Error("DEVUP_ENVELOPE_TOO_LARGE");return N.envelope},fastTheme:async function(e){let t=Math.max(0,Math.floor(Number(e.theme.offset)||0));function r(e,t=new WeakSet,n=0){if(null===e||["string","number","boolean"].includes(typeof e))return e;if(void 0===e)return{$undefined:!0};if("bigint"==typeof e)return{$bigint:e.toString()};if(["function","symbol"].includes(typeof e))return{$unsupported:typeof e};if(n>12)return{$truncated:"max-depth"};if("object"==typeof e&&"parent"in e&&"string"==typeof e.id&&"string"==typeof e.type)return{$nodeId:e.id,$nodeType:e.type};if(Array.isArray(e))return e.map(e=>r(e,t,n+1));if(ArrayBuffer.isView(e))return{$binary:e.constructor.name,byteLength:e.byteLength};if(e instanceof ArrayBuffer)return{$binary:"ArrayBuffer",byteLength:e.byteLength};if(t.has(e))return{$circular:!0};t.add(e);let i={};for(let a of function(e){let t=new Set(Object.keys(e)),r=e;for(;r&&r!==Object.prototype;){for(let e of Object.getOwnPropertyNames(r))t.add(e);r=Object.getPrototypeOf(r)}return[...t].sort()}(e))if(!(a.startsWith("_")||["parent","children","consumers"].includes(a)))try{let l=r(e[a],t,n+1);l&&"function"===l.$unsupported||(i[a]=l)}catch(e){i[a]={$error:"unavailable"}}return t.delete(e),i}let n=new Set,i=new Map;for(let e of[figma.root,...figma.root.findAll(()=>!0)])for(let t of["boundVariables","fills","strokes","effects","layoutGrids","textStyleId","fillStyleId","strokeStyleId","backgroundStyleId","effectStyleId","gridStyleId"])try{!function e(t,r="",a=new WeakSet,l=0){if(!(l>16)&&null!==t&&"object"==typeof t&&!a.has(t)){if(a.add(t),Array.isArray(t)){for(let n of t)e(n,r,a,l+1);return}for(let[o,s]of("VARIABLE_ALIAS"===t.type&&"string"==typeof t.id&&t.id&&"figma.mixed"!==t.id&&"MIXED"!==t.id&&n.add(t.id),Object.entries(t))){let t="textStyleId"===o?"TEXT":["fillStyleId","strokeStyleId","backgroundStyleId"].includes(o)?"PAINT":"effectStyleId"===o?"EFFECT":"gridStyleId"===o?"GRID":null;t&&"string"==typeof s&&s&&"figma.mixed"!==s&&"MIXED"!==s&&!i.has(s)&&i.set(s,t),e(s,o||r,a,l+1)}}}({[t]:e[t]})}catch(e){}let[a,l,o,s,d,f]=await Promise.all([figma.variables.getLocalVariableCollectionsAsync(),figma.variables.getLocalVariablesAsync(),figma.getLocalPaintStylesAsync(),figma.getLocalTextStylesAsync(),figma.getLocalEffectStylesAsync(),figma.getLocalGridStylesAsync()]),u=new Set(l.map(e=>e.id)),c=new Set([...o,...s,...d,...f].map(e=>e.id)),y=[],h=[...n].filter(e=>!u.has(e)).sort().map(async e=>{try{return await figma.variables.getVariableByIdAsync(e)||null}catch(t){return y.push({id:e,kind:"variable",reason:"notFoundOrUnavailable"}),null}}),p=[...i.entries()].filter(([e])=>!c.has(e)).sort(([e],[t])=>e.localeCompare(t)).map(async([e,t])=>{try{let r=await figma.getStyleByIdAsync(e);return r?{style:r,styleType:t}:null}catch(t){return y.push({id:e,kind:"style",reason:"notFoundOrUnavailable"}),null}}),g=(await Promise.all(h)).filter(Boolean),m=(await Promise.all(p)).filter(Boolean);for(let e of[...n].filter(e=>!u.has(e)))g.some(t=>t.id===e)||y.some(t=>t.id===e)||y.push({id:e,kind:"variable",reason:"notFoundOrUnavailable"});for(let[e]of[...i.entries()].filter(([e])=>!c.has(e)))m.some(t=>t.style.id===e)||y.some(t=>t.id===e)||y.push({id:e,kind:"style",reason:"notFoundOrUnavailable"});let b=[...new Set(g.map(e=>e.variableCollectionId))].filter(e=>!a.some(t=>t.id===e)).sort(),x=(await Promise.all(b.map(async e=>{try{return await figma.variables.getVariableCollectionByIdAsync(e)}catch(e){return null}}))).filter(Boolean);function E(e,t){return{...r(e),styleType:t,value:r("PAINT"===t?e.paints:"EFFECT"===t?e.effects:"GRID"===t?e.layoutGrids:e)}}let S=[...o.map(e=>E(e,"PAINT")),...s.map(e=>E(e,"TEXT")),...d.map(e=>E(e,"EFFECT")),...f.map(e=>E(e,"GRID")),...m.map(({style:e,styleType:t})=>E(e,t))].sort((e,t)=>e.id.localeCompare(t.id)),I=[...l,...g].map(e=>r(e)).sort((e,t)=>e.id.localeCompare(t.id)),A=[...a,...x].map(e=>r(e)).sort((e,t)=>e.id.localeCompare(t.id));function N(e){let t=[];for(let r=0;r=55296&&n<=56319){let t=r+1=56320&&t<=57343?(n=65536+(n-55296<<10)+(t-56320),r+=1):n=65533}else n>=56320&&n<=57343&&(n=65533);n<128?t.push(n):n<2048?t.push(192|n>>6,128|63&n):n<65536?t.push(224|n>>12,128|n>>6&63,128|63&n):t.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n)}return new Uint8Array(t)}y.sort((e,t)=>e.kind.localeCompare(t.kind)||e.id.localeCompare(t.id));let w=[...A.map(e=>({kind:"collection",value:e})),...I.map(e=>({kind:"variable",value:e})),...S.map(e=>({kind:"style",value:e})),...[...n].sort().map(e=>({kind:"usedVariableId",value:e})),...[...i.keys()].sort().map(e=>({kind:"usedStyleId",value:e})),...y.map(e=>({kind:"unresolved",value:e}))];if(t>w.length)throw Error("DEVUP_SNAPSHOT_RANGE_INVALID");let O=w.map(e=>N(JSON.stringify(e.value)).length+1),T=18432,v=null;for(let e=0;e<6;e+=1){let{pageItems:e,packed:r}=function(e){let r=[],n=0;for(let i=t;i0)||!(n+O[i]>e));i+=1)r.push(w[i]),n+=O[i];return{pageItems:r,packed:n}}(T),n=function(e,r){let n=t=>e.filter(e=>e.kind===t).map(e=>e.value),i=n("collection"),a=n("variable"),l=n("style"),o=n("unresolved"),s={kind:"devupFastThemeEnvelope",schemaVersion:1,source:{fileKey:figma.fileKey||"",version:null},resources:{collections:i,variables:a,styles:l,usedRemoteVariables:[],usedVariableIds:n("usedVariableId"),usedStyleIds:n("usedStyleId"),localComplete:!0,usedRemoteComplete:0===y.length,unresolved:o},page:{offset:t,nextOffset:r,complete:r>=w.length,totalItems:w.length},integrity:{collectionCount:i.length,variableCount:a.length,styleCount:l.length,unresolvedCount:o.length,utf8Bytes:0}},d=new Uint8Array;for(let e=0;e<8&&(d=N(JSON.stringify(s)),s.integrity.utf8Bytes!==d.length);e+=1)s.integrity.utf8Bytes=d.length;if(d=N(JSON.stringify(s)),s.integrity.utf8Bytes!==d.length)throw Error("DEVUP_ENVELOPE_LENGTH_UNSTABLE");return{envelope:s,bytes:d.length}}(e,t+e.length);if(n.bytes<=19456){v=n;break}if(e.length<=1)break;T=Math.max(1,Math.min(T-1,r-(n.bytes-19456)-256))}if(null===v||v.bytes>8388608)throw Error("DEVUP_ENVELOPE_TOO_LARGE");return v.envelope},largeValue:async function(e){let t,r=e.largeValue,n=await figma.getNodeByIdAsync(r.nodeId);if(!n)throw Error("DEVUP_NODE_NOT_FOUND");function i(e){let t=[];for(let r=0;r=55296&&n<=56319){let t=r+1=56320&&t<=57343?(n=65536+(n-55296<<10)+(t-56320),r+=1):n=65533}else n>=56320&&n<=57343&&(n=65533);n<128?t.push(n):n<2048?t.push(192|n>>6,128|63&n):n<65536?t.push(224|n>>12,128|n>>6&63,128|63&n):t.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n)}return new Uint8Array(t)}let a=null;try{if("$export:svg"===r.field){if("function"!=typeof n.exportAsync)throw Error("unsupported");let e=await n.exportAsync({format:"SVG_STRING"});if("string"!=typeof e)throw Error("unsupported");a=i(e)}else if("string"==typeof r.field&&r.field.startsWith("$export:png")){if("function"!=typeof n.exportAsync)throw Error("unsupported");let e=Math.min(4,Math.max(1,Math.floor(Number(r.field.split("@")[1])||1))),t=await n.exportAsync({format:"PNG",constraint:{type:"SCALE",value:e}});a=t instanceof Uint8Array?t:new Uint8Array(t)}else if("styledTextSegments"===r.field&&"TEXT"===n.type&&"function"==typeof n.getStyledTextSegments)t=n.getStyledTextSegments(["fontName","fontWeight","fontSize","textDecoration","textCase","lineHeight","letterSpacing","fills","textStyleId","fillStyleId","listOptions","indentation","hyperlink"]);else if(r.field in n)t=n[r.field];else throw Error("unsupported")}catch(e){return{kind:"devupLargeValueUnsupported",fileKey:figma.fileKey||"",version:r.version,nodeId:r.nodeId,field:r.field,byteLength:r.byteLength,sha256:r.sha256,errorCode:"DEVUP_FIELD_UNSUPPORTED_BY_UPSTREAM"}}let l=null===a?i(JSON.stringify(function e(t,r=new WeakSet,n=0){if(null===t||["string","number","boolean"].includes(typeof t))return t;if(void 0===t)return{$undefined:!0};if("bigint"==typeof t)return{$bigint:t.toString()};if(["function","symbol"].includes(typeof t))return{$unsupported:typeof t};if(n>12)return{$truncated:"max-depth"};if("object"==typeof t&&"parent"in t&&"string"==typeof t.id&&"string"==typeof t.type)return{$nodeId:t.id,$nodeType:t.type};if(Array.isArray(t))return t.map(t=>e(t,r,n+1));if(ArrayBuffer.isView(t))return{$binary:t.constructor.name,byteLength:t.byteLength};if(t instanceof ArrayBuffer)return{$binary:"ArrayBuffer",byteLength:t.byteLength};if(r.has(t))return{$circular:!0};r.add(t);let i={};for(let a of Object.keys(t).sort())try{let l=e(t[a],r,n+1);l&&"function"===l.$unsupported||(i[a]=l)}catch(e){i[a]={$error:String(e&&e.message?e.message:e)}}return r.delete(t),i}(t))):a,o=function(e){let t=[0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,0xe49b69c1,0xefbe4786,0xfc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x6ca6351,0x14292967,0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2],r=e.length,n=64*Math.ceil((r+9)/64),i=new Uint8Array(n);i.set(e),i[r]=128;let a=8*r;for(let e=0;e<8;e+=1)i[n-1-e]=255&Math.floor(a/2**(8*e));let l=[0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19],o=(e,t)=>e>>>t|e<<32-t;for(let e=0;e>>3,n=o(r[e-2],17)^o(r[e-2],19)^r[e-2]>>>10;r[e]=r[e-16]+t+r[e-7]+n>>>0}let[n,a,s,d,f,u,c,y]=l;for(let e=0;e<64;e+=1){let i=y+(o(f,6)^o(f,11)^o(f,25))+(f&u^~f&c)+t[e]+r[e]>>>0,l=(o(n,2)^o(n,13)^o(n,22))+(n&a^n&s^a&s)>>>0;y=c,c=u,u=f,f=d+i>>>0,d=s,s=a,a=n,n=i+l>>>0}for(let[e,t]of[n,a,s,d,f,u,c,y].entries())l[e]=l[e]+t>>>0}return l.map(e=>e.toString(16).padStart(8,"0")).join("")}(l);if(l.length!==r.byteLength||o!==r.sha256)throw Error("DEVUP_LARGE_VALUE_CHANGED");let s=Math.max(0,Math.floor(Number(r.offset)||0)),d=Math.min(65536,Math.max(1,Math.floor(Number(r.maxChunkBytes)||8192)));if(s>=l.length)throw Error("DEVUP_LARGE_VALUE_RANGE_INVALID");let f=Math.min(l.length,s+d);return{kind:"devupLargeValueFragment",fileKey:figma.fileKey||"",version:r.version,nodeId:r.nodeId,field:r.field,offset:s,nextOffset:f,byteLength:l.length,sha256:o,dataBase64:function(e){let t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",r="";for(let n=0;n>2],r+=t[(3&i)<<4|a>>4],r+=n+1>6]:"=",r+=n+2e.id),nodes:t.map(e=>({id:e.id,type:e.type,fields:{name:e.name,parentId:null,childrenIds:[]},extra:{},fieldErrors:{}})),diagnostics:[]}},search:async function(e){let t=await figma.getNodeByIdAsync(e.nodeId);if(!t)throw Error("DEVUP_NODE_NOT_FOUND");let r=t;for(;r&&"PAGE"!==r.type;)r=r.parent;if(!r||"PAGE"!==r.type)throw Error("DEVUP_PAGE_NOT_FOUND");await figma.setCurrentPageAsync(r);let n=e.search,i=new Set((n.nodeTypes.length?n.nodeTypes:["PAGE","SECTION","FRAME","COMPONENT_SET","COMPONENT"]).map(e=>e.toUpperCase()));function a(e){return e.normalize("NFC").toLocaleLowerCase().replace(/\s/gu,"")}let l=t===r?r.findAll(()=>!0):"findAll"in t?t.findAll(()=>!0):[],o=[t,...l].filter(e=>i.has(e.type)&&"string"==typeof e.name).map(e=>({node:e,score:function(e){if(e===n.query)return 400;if("exact"===n.matchKind)return null;let t=a(e),r=a(n.query);if(t===r)return 300;if(t.startsWith(r))return 200;if(t.includes(r))return 100;if("fuzzy"!==n.matchKind)return null;let i=function(e,t){let r=Array.from({length:t.length+1},(e,t)=>t);for(let n=0;nnull!==e.score).sort((e,t)=>t.score-e.score||e.node.name.localeCompare(t.node.name)||e.node.id.localeCompare(t.node.id)).slice(0,n.limit),s=new Map([[r.id,r]]);for(let e of[t,...o.map(e=>e.node)]){let t=e;for(;t&&"DOCUMENT"!==t.type;)s.set(t.id,t),t=t.parent}return{fileKey:figma.fileKey||"",version:null,rootIds:[r.id],nodes:[...s.values()].map(e=>({id:e.id,type:e.type,fields:{name:e.name,parentId:e.parent&&"DOCUMENT"!==e.parent.type?e.parent.id:null,childrenIds:"children"in e?e.children.map(e=>e.id):[]},extra:{},fieldErrors:{}})),diagnostics:[]}},sectionIndex:async function(e){let t=await figma.getNodeByIdAsync(e.nodeId);if(!t)throw Error("DEVUP_NODE_NOT_FOUND");if("SECTION"!==t.type){let e=t.parent,r=new Set;for(;e&&"SECTION"!==e.type&&!r.has(e.id);)r.add(e.id),e=e.parent;let n=e&&"SECTION"===e.type?e.id:null,i=n&&figma.fileKey?`https://www.figma.com/design/${figma.fileKey}?node-id=${n.replace(/:/g,"-")}`:null;throw Error("DEVUP_SECTION_REQUIRED "+JSON.stringify({pluginCode:"DEVUP_SECTION_REQUIRED",stage:"section-index",nodeId:t.id,nodeType:t.type,sectionId:n,nextAction:{tool:"devup_figma_export",how:n?`The url must point to a SECTION. This capture's SECTION is ${n}; select frames with frameIds.`:"The url must point to a SECTION. This node has no ancestor SECTION; choose the intended SECTION in Figma and copy its link.",arguments:i?"FRAME"===t.type&&t.parent===e?{url:i,frameIds:[t.id]}:{url:i}:null,requiredArguments:i?[]:["url"]}}))}let r=2048;function n(e){let t=e.absoluteBoundingBox||{x:"number"==typeof e.x?e.x:0,y:"number"==typeof e.y?e.y:0,width:"number"==typeof e.width?e.width:0,height:"number"==typeof e.height?e.height:0};return[t.x,t.y,t.width,t.height].every(Number.isFinite)?{x:t.x,y:t.y,width:t.width,height:t.height}:null}function i(e,t){if("FRAME"!==e.type||!1===e.visible||!t)return!1;let r=t.width/Math.max(1,t.height);return t.width>=240&&t.width<=1800&&t.height>=300&&t.height<=2e3&&r>=.25&&r<=2.5}function a(e){let t=0;for(let r=0;r=55296&&n<=56319&&r+1[e.id,t.id])),s=[],d=0;for(let e=0;ee.id));for(let r of t.children){if(e.has(r.id))continue;let t=n(r);t&&!1!==r.visible&&s.push({node:r,box:t})}}s.sort((e,t)=>e.box.y-t.box.y||e.box.x-t.box.x||e.node.id.localeCompare(t.node.id));let f=l.length>d||s.length>100,u=s.slice(0,100),c=new Set(u.map(({node:e})=>e.id)),y=new Set(e.rootIds),h={},p=new Map([[t.id,null]]);for(let e=0;e{let r=e.parent;for(;r&&r.id!==t.id&&!c.has(r.id);)r=r.parent;return[e.id,r&&c.has(r.id)?r.id:t.id]})),m=e=>u.filter(({node:t})=>g.get(t.id)===e).map(({node:e})=>e.id),b=n(t);if(!b)throw Error("DEVUP_NODE_BOUNDS_UNAVAILABLE");let x={id:t.id,type:t.type,fields:{name:t.name,parentId:t.parent&&"DOCUMENT"!==t.parent.type?t.parent.id:null,childrenIds:m(t.id),absoluteBoundingBox:b,visible:!1!==t.visible,projectionTruncated:f,nodeScreenIds:h},extra:{},fieldErrors:{}},E=u.length,S=u.map(({node:e,box:t})=>{let n=function(e){let t=[e],r=0,n=0;for(let e=0;er}}(e),l=Math.floor(r/E);E-=1;let o=function(e,t){let r=[e],n="",i=0,l=0,o=!1;if(t<=0)return{text:"",state:"budget-exhausted",spent:0};for(let e=0;e=120||l+e>t)return{text:n.trimEnd(),state:l+e>t?"budget-exhausted":"truncated",spent:l};n+=r,i+=1,l+=e}}if("children"in s){let e=Math.max(0,64-r.length);s.children.length>e&&(o=!0),r.push(...s.children.slice(0,e))}}}return{text:n,state:o?"truncated":n?"available":"no-text",spent:l}}(e,l);return r-=o.spent,{id:e.id,type:e.type,fields:{name:"string"==typeof e.name?e.name:"",parentId:g.get(e.id),childrenIds:m(e.id),absoluteBoundingBox:t,visible:!1!==e.visible,breadcrumb:function(e){let t=[],r=e;for(;r&&"DOCUMENT"!==r.type;)"string"==typeof r.name&&r.name&&t.push(r.name),r=r.parent;return t.reverse()}(e),directChildCount:"children"in e?e.children.length:0,textPreview:o.text,textPreviewState:o.state,subtreeNodeCount:n.subtreeNodeCount,estimatedSerializedBytes:n.estimatedSerializedBytes,selectionReasons:[i(e,t)?"screen-like":"explicit-selection-only","inside-section"],estimateTruncated:n.truncated},extra:{},fieldErrors:{}}}),I={fileKey:figma.fileKey||"",version:null,rootIds:[t.id],nodes:[x,...S],diagnostics:[]},A=a(JSON.stringify(I));for(let e=S.length-1;e>=0&&A>19456;e-=1)S[e].fields.textPreview="",S[e].fields.textPreviewState="budget-exhausted",A=a(JSON.stringify(I));if(A>19456)throw Error("DEVUP_SECTION_INDEX_TOO_LARGE "+JSON.stringify({pluginCode:"DEVUP_SECTION_INDEX_TOO_LARGE",stage:"section-index",responseBytes:A,maxResponseBytes:19456}));return I},snapshot:async function(e){let t=await figma.getNodeByIdAsync(e.nodeId);if(!t)throw Error("DEVUP_NODE_NOT_FOUND");let r=["absoluteBoundingBox","absoluteRenderBounds","arcData","backgroundStyleId","blendMode","bottomLeftRadius","bottomRightRadius","boundVariables","characters","clipsContent","componentProperties","componentPropertyDefinitions","componentPropertyReferences","constraints","cornerRadius","counterAxisAlignItems","dashPattern","defaultVariant","effectStyleId","effects","fillStyleId","fills","fontName","fontSize","gridColumnAnchorIndex","gridColumnCount","gridColumnGap","gridColumnSizes","gridColumnSpan","gridRowAnchorIndex","gridRowCount","gridRowGap","gridRowSizes","gridRowSpan","gridStyleId","height","inferredAutoLayout","isAsset","isMask","itemSpacing","layoutGrow","layoutMode","layoutWrap","layoutPositioning","layoutSizingHorizontal","layoutSizingVertical","letterSpacing","lineHeight","maxHeight","maxLines","maxWidth","minHeight","minWidth","name","opacity","overflowDirection","paddingBottom","paddingLeft","paddingRight","paddingTop","primaryAxisAlignItems","reactions","rotation","strokeAlign","strokeBottomWeight","strokeLeftWeight","strokeRightWeight","strokeStyleId","strokeTopWeight","strokeWeight","strokes","targetAspectRatio","textAlignHorizontal","textAlignVertical","textAutoResize","textCase","textDecoration","textStyleId","textTruncation","topLeftRadius","topRightRadius","variantProperties","visible","width","x","y"],n=new Set(r),i=["fontName","fontWeight","fontSize","textDecoration","textCase","lineHeight","letterSpacing","fills","textStyleId","fillStyleId","listOptions","indentation","hyperlink"],a=e.snapshot,l=Math.max(0,Math.floor(Number(a.offset)||0)),o=Math.min(a.maxEnvelopeBytes?Math.max(8192,Math.floor(Number(a.maxEnvelopeBytes))):16e3,Math.max(4096,Math.floor(Number(a.maxPayloadBytes)||15e3))),s=Math.min(o-1024,Math.max(512,Math.floor(Number(a.maxFieldBytes)||4096))),d=new Set(["id","type","parent","children"]),f=new Set(["parentId","childrenIds","name","characters","styledTextSegments","boundVariables"]);function u(e,t,r){let n=function(e){let t=[];for(let r=0;r=55296&&n<=56319){let t=r+1=56320&&t<=57343?(n=65536+(n-55296<<10)+(t-56320),r+=1):n=65533}else n>=56320&&n<=57343&&(n=65533);n<128?t.push(n):n<2048?t.push(192|n>>6,128|63&n):n<65536?t.push(224|n>>12,128|n>>6&63,128|63&n):t.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n)}return new Uint8Array(t)}(JSON.stringify(r));return n.length>0x1000000?{$truncated:"max-large-value-bytes",byteLength:n.length}:{$largeValue:{nodeId:e,field:t,byteLength:n.length,sha256:function(e){let t=[0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,0xe49b69c1,0xefbe4786,0xfc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x6ca6351,0x14292967,0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2],r=64*Math.ceil((e.length+9)/64),n=new Uint8Array(r);n.set(e),n[e.length]=128;let i=8*e.length;for(let e=0;e<8;e+=1)n[r-1-e]=255&Math.floor(i/2**(8*e));let a=[0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19],l=(e,t)=>e>>>t|e<<32-t;for(let e=0;e>>3,n=l(r[e-2],17)^l(r[e-2],19)^r[e-2]>>>10;r[e]=r[e-16]+t+r[e-7]+n>>>0}let[i,o,s,d,f,u,c,y]=a;for(let e=0;e<64;e+=1){let n=y+(l(f,6)^l(f,11)^l(f,25))+(f&u^~f&c)+t[e]+r[e]>>>0,a=(l(i,2)^l(i,13)^l(i,22))+(i&o^i&s^o&s)>>>0;y=c,c=u,u=f,f=d+n>>>0,d=s,s=o,o=i,i=n+a>>>0}for(let[e,t]of[i,o,s,d,f,u,c,y].entries())a[e]=a[e]+t>>>0}return a.map(e=>e.toString(16).padStart(8,"0")).join("")}(n),cursor:{nextOffset:0,maxChunkBytes:12288}}}}function c(e){return function(e){let t=0;for(let r=0;r=55296&&n<=56319&&r+112)return{$truncated:"max-depth"};if("object"==typeof t&&"parent"in t&&"string"==typeof t.id&&"string"==typeof t.type)return{$nodeId:t.id,$nodeType:t.type};if(Array.isArray(t))return t.map(t=>e(t,r,n+1));if(ArrayBuffer.isView(t))return{$binary:t.constructor.name,byteLength:t.byteLength};if(t instanceof ArrayBuffer)return{$binary:"ArrayBuffer",byteLength:t.byteLength};if(r.has(t))return{$circular:!0};r.add(t);let i={};for(let a of Object.keys(t).sort())try{let l=e(t[a],r,n+1);l&&"function"===l.$unsupported||(i[a]=l)}catch(e){i[a]={$error:String(e&&e.message?e.message:e)}}return r.delete(t),i}(r),a=c(i);if(a<=s)return i;let l=u(e,t,i);return l.$truncated&&(n[t]=`DEVUP_FIELD_VALUE_UNSUPPORTED:${a}>16777216`),l}let h=[],p=[t];for(;p.length;){let e=p.shift();h.push(e),"children"in e&&p.push(...e.children)}let g=[],m=o-1024,b=2;for(let e=l;eNumber(e.protected)-Number(t.protected)||t.byteLength-e.byteLength),n)){if(r<=t)break;let n=u(e.id,i.name,e[i.sectionName][i.name]);e[i.sectionName][i.name]=n,n.$truncated&&(e.fieldErrors[i.name]=`DEVUP_FIELD_VALUE_UNSUPPORTED:${i.byteLength}>16777216`),r=c(e)}return e}(function(e){let t={},a={},l={};for(let i of(t.parentId=e.parent?e.parent.id:null,e.parent&&("PAGE"===e.parent.type||"SECTION"===e.parent.type||"COMPONENT_SET"===e.parent.type)&&(t.parentType=e.parent.type,"SECTION"===e.parent.type&&(t.parentName=e.parent.name)),t.childrenIds="children"in e?e.children.map(e=>e.id):[],!("overflowDirection"in e)&&["FRAME","COMPONENT","INSTANCE","COMPONENT_SET"].includes(e.type)&&(t.overflowDirection=null),function(e){let t=new Set,n=e;for(;n&&n!==Object.prototype;){for(let e of Object.getOwnPropertyNames(n))t.add(e);n=Object.getPrototypeOf(n)}for(let n of r)try{n in e&&t.add(n)}catch(e){}return[...t].sort()}(e)))if(!(d.has(i)||i.startsWith("_")))try{let r=e[i];if("function"==typeof r)continue;let o=y(e.id,i,r,l);(n.has(i)?t:a)[i]=o}catch(e){l[i]=String(e&&e.message?e.message:e)}if("TEXT"===e.type&&"function"==typeof e.getStyledTextSegments)try{t.styledTextSegments=y(e.id,"styledTextSegments",e.getStyledTextSegments(i),l)}catch(e){l.styledTextSegments=String(e&&e.message?e.message:e)}return{id:e.id,type:e.type,fields:t,extra:a,fieldErrors:l}}(h[e]),m),a=c(t)+ +!!g.length;if(g.length&&b+a>m)break;g.push(t),b+=a}let x=Math.min(h.length,l+g.length);return g.push({id:"__DEVUP_SNAPSHOT_CURSOR__",type:"DEVUP_INTERNAL",fields:{offset:l,nextOffset:x,complete:x>=h.length,totalNodes:h.length},extra:{},fieldErrors:{}}),{fileKey:figma.fileKey||"",version:null,rootIds:[t.id],nodes:g,diagnostics:[]}},usedResources:async function(e){let t=e.resources;function r(e,t=new WeakSet,n=0){if(null===e||["string","number","boolean"].includes(typeof e))return e;if(void 0===e)return{$undefined:!0};if("bigint"==typeof e)return{$bigint:e.toString()};if(["function","symbol"].includes(typeof e))return{$unsupported:typeof e};if(n>12)return{$truncated:"max-depth"};if("object"==typeof e&&"parent"in e&&"string"==typeof e.id&&"string"==typeof e.type)return{$nodeId:e.id,$nodeType:e.type};if(Array.isArray(e))return e.map(e=>r(e,t,n+1));if(ArrayBuffer.isView(e))return{$binary:e.constructor.name,byteLength:e.byteLength};if(e instanceof ArrayBuffer)return{$binary:"ArrayBuffer",byteLength:e.byteLength};if(t.has(e))return{$circular:!0};t.add(e);let i={},a=new Set(Object.keys(e)),l=e;for(;l&&l!==Object.prototype;){for(let e of Object.getOwnPropertyNames(l))a.add(e);l=Object.getPrototypeOf(l)}for(let l of[...a].sort())if(!(l.startsWith("_")||["parent","children","consumers"].includes(l)))try{let a=r(e[l],t,n+1);a&&"function"===a.$unsupported||(i[l]=a)}catch(e){i[l]={$error:"unavailable"}}return t.delete(e),i}let n=new Map,i="ok";try{for(let e of(await figma.variables.getLocalVariablesAsync()))n.set(e.id,e)}catch(e){i="unavailable"}let a=await Promise.all(t.variableIds.map(async e=>{let t=n.get(e);if(t)return{value:r(t),collectionId:t.variableCollectionId};try{let t=await figma.variables.getVariableByIdAsync(e);return t?{value:r(t),collectionId:t.variableCollectionId}:{unresolved:{id:e,kind:"variable",reason:"notInFileAndLookupEmpty"}}}catch(t){return{unresolved:{id:e,kind:"variable",reason:"notInFileAndLookupThrew"}}}})),l=[...new Set(a.flatMap(e=>e.collectionId?[e.collectionId]:[]))].sort(),o=await Promise.all(l.map(async e=>{try{let t=await figma.variables.getVariableCollectionByIdAsync(e);return t?[r(t)]:[]}catch(e){return[]}})),s=await Promise.all(t.styles.map(async e=>{try{let t=await figma.getStyleByIdAsync(e.id);if(!t)return{unresolved:{id:e.id,kind:"style",reason:"notFoundOrUnavailable"}};return{value:{...r(t),styleType:e.styleType,value:r("PAINT"===e.styleType?t.paints:"EFFECT"===e.styleType?t.effects:"GRID"===e.styleType?t.layoutGrids:t)}}}catch(t){return{unresolved:{id:e.id,kind:"style",reason:"notFoundOrUnavailable"}}}}));return{collections:o.flat(),variables:a.flatMap(e=>e.value?[e.value]:[]),styles:s.flatMap(e=>e.value?[e.value]:[]),usedVariableIds:t.variableIds,usedStyleIds:t.styles.map(e=>e.id),localVariableListing:i,localVariableCount:n.size,unresolved:[...a,...s].flatMap(e=>e.unresolved?[e.unresolved]:[])}},variableCatalog:async function(e){let[t,r,n,i,a]=await Promise.all([figma.variables.getLocalVariableCollectionsAsync(),figma.getLocalPaintStylesAsync(),figma.getLocalTextStylesAsync(),figma.getLocalEffectStylesAsync(),figma.getLocalGridStylesAsync()]),l=["PAINT","TEXT","EFFECT","GRID"];return{collections:t.map(e=>(function e(t,r=new WeakSet,n=0){if(null===t||["string","number","boolean"].includes(typeof t))return t;if(void 0===t)return{$undefined:!0};if("bigint"==typeof t)return{$bigint:t.toString()};if(["function","symbol"].includes(typeof t))return{$unsupported:typeof t};if(n>12)return{$truncated:"max-depth"};if(Array.isArray(t))return t.map(t=>e(t,r,n+1));if(r.has(t))return{$circular:!0};r.add(t);let i={},a=new Set(Object.keys(t)),l=t;for(;l&&l!==Object.prototype;){for(let e of Object.getOwnPropertyNames(l))a.add(e);l=Object.getPrototypeOf(l)}for(let l of[...a].sort())if(!l.startsWith("_"))try{let a=e(t[l],r,n+1);a&&"function"===a.$unsupported||(i[l]=a)}catch(e){i[l]={$error:String(e&&e.message?e.message:e)}}return r.delete(t),i})(e)),variableIds:[...new Set(t.flatMap(e=>e.variableIds))].sort(),styles:[r,n,i,a].flatMap((e,t)=>e.map(e=>({id:e.id,styleType:l[t]}))).sort((e,t)=>e.id.localeCompare(t.id)),localComplete:!0,usedRemoteComplete:!1}},variables:async function(e){let t=e.resources;function r(e,t=new WeakSet,n=0){if(null===e||["string","number","boolean"].includes(typeof e))return e;if(void 0===e)return{$undefined:!0};if("bigint"==typeof e)return{$bigint:e.toString()};if(["function","symbol"].includes(typeof e))return{$unsupported:typeof e};if(n>12)return{$truncated:"max-depth"};if("object"==typeof e&&"parent"in e&&"string"==typeof e.id&&"string"==typeof e.type)return{$nodeId:e.id,$nodeType:e.type};if(Array.isArray(e))return e.map(e=>r(e,t,n+1));if(ArrayBuffer.isView(e))return{$binary:e.constructor.name,byteLength:e.byteLength};if(e instanceof ArrayBuffer)return{$binary:"ArrayBuffer",byteLength:e.byteLength};if(t.has(e))return{$circular:!0};t.add(e);let i={},a=new Set(Object.keys(e)),l=e;for(;l&&l!==Object.prototype;){for(let e of Object.getOwnPropertyNames(l))a.add(e);l=Object.getPrototypeOf(l)}for(let l of[...a].sort())if(!(l.startsWith("_")||["parent","children","consumers"].includes(l)))try{let a=r(e[l],t,n+1);a&&"function"===a.$unsupported||(i[l]=a)}catch(e){i[l]={$error:String(e&&e.message?e.message:e)}}return t.delete(e),i}let[n,i]=await Promise.all([Promise.all(t.variableIds.map(e=>figma.variables.getVariableByIdAsync(e))),Promise.all(t.styles.map(e=>figma.getStyleByIdAsync(e.id)))]),a=new Map(t.styles.map(e=>[e.id,e])),l=await Promise.all(i.filter(Boolean).map(async e=>{let t=a.get(e.id),n=t.styleType;if(Number.isInteger(t.consumerStart)&&Number.isInteger(t.consumerEnd)){let i=await e.getStyleConsumersAsync();return{id:e.id,styleType:n,$consumerStart:t.consumerStart,$consumerEntries:i.slice(t.consumerStart,t.consumerEnd).map(e=>[e.node.id,e.node.type,r(e.fields)])}}let i=await e.getStyleConsumersAsync();return{...r(e),styleType:n,$consumerCount:i.length,value:r("PAINT"===n?e.paints:"EFFECT"===n?e.effects:"GRID"===n?e.layoutGrids:e)}}));return{variables:n.filter(Boolean).map(e=>r(e)),styles:l}}};async function i(e){let t=n[e.script];if(!t)return{kind:"devup-result",requestId:e.requestId,error:`DEVUP_BRIDGE_UNKNOWN_SCRIPT: ${e.script} (아는 스크립트: ${Object.keys(n).join(", ")})`};try{var r;let n=await t({nodeId:(r=e.params).nodeId??"",rootIds:r.rootIds??[],snapshot:r.snapshot??{},search:r.search??{},explore:r.explore??{},resources:r.resources??{variableIds:[],styles:[]},largeValue:r.largeValue??{},asset:r.asset??{},theme:r.theme??{offset:0}});return{kind:"devup-result",requestId:e.requestId,data:n}}catch(t){return{kind:"devup-result",requestId:e.requestId,error:t instanceof Error?t.message:String(t)}}}let a=[],l=!1;async function o(){if(!l){l=!0;try{for(;a.length>0;){let e=a.shift(),t=await i(e).catch(t=>({kind:"devup-result",requestId:e.requestId,error:t instanceof Error?t.message:String(t)}));figma.ui.postMessage(t)}}finally{l=!1}}}figma.showUI(__html__,{width:320,height:220}),figma.ui.onmessage=e=>{if("object"==typeof e&&null!==e){if("devup-ready"===e.kind){let e={kind:"devup-status",fileKey:figma.fileKey??null,fileName:figma.root.name,port:1993};figma.ui.postMessage(e);return}"devup-job"===e.kind&&(a.push(e),o())}}})(); \ No newline at end of file +(()=>{"use strict";var e={},t={};function r(n){var i=t[n];if(void 0!==i)return i.exports;var a=t[n]={exports:{}};return e[n](a,a.exports,r),a.exports}r.rv=()=>"1.7.12",r.ruid="bundler=rspack@1.7.12";let n={assets:async function(e){let t=e.asset;function r(e){return{kind:"devupAssetExport",fileKey:figma.fileKey||"",version:t.version,assetId:t.assetId,nodeId:t.nodeId,field:t.field,imageHash:t.imageHash,format:t.format,scale:t.scale,status:"failed",byteLength:null,sha256:null,errorCode:e}}try{let e=await figma.getNodeByIdAsync(t.nodeId);if(!e||"function"!=typeof e.exportAsync)return r("DEVUP_ASSET_UNSUPPORTED_BY_UPSTREAM");if("string"==typeof t.field&&t.field.startsWith("fills/")){let n=Number(t.field.slice(6)),i="fills"in e&&Array.isArray(e.fills)?e.fills:[],a=Number.isInteger(n)?i[n]:null,l=a&&"IMAGE"===a.type?a.imageHash||a.imageRef:null;if(!a||l!==t.imageHash)return r("DEVUP_ASSET_SOURCE_CHANGED")}else if("node"!==t.field)return r("DEVUP_ASSET_FIELD_UNSUPPORTED");let n=String(t.format||"").toUpperCase();if(!["PNG","JPG","SVG","PDF"].includes(n))return r("DEVUP_ASSET_FORMAT_UNSUPPORTED");let i=Math.min(4,Math.max(1,Math.floor(Number(t.scale)||1))),a="SVG"===n,l={format:a?"SVG_STRING":n};("PNG"===n||"JPG"===n)&&(l.constraint={type:"SCALE",value:i});let o=await e.exportAsync(l),s=a&&"string"==typeof o?o:null,d=null===s?o instanceof Uint8Array?o:new Uint8Array(o):function(e){let t=[];for(let r=0;r=55296&&n<=56319){let t=r+1=56320&&t<=57343?(n=65536+(n-55296<<10)+(t-56320),r+=1):n=65533}else n>=56320&&n<=57343&&(n=65533);n<128?t.push(n):n<2048?t.push(192|n>>6,128|63&n):n<65536?t.push(224|n>>12,128|n>>6&63,128|63&n):t.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n)}return new Uint8Array(t)}(s);if(0===d.length||d.length>8388608)return r("DEVUP_ASSET_RESPONSE_TOO_LARGE");let f=function(e){let t=[0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,0xe49b69c1,0xefbe4786,0xfc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x6ca6351,0x14292967,0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2],r=64*Math.ceil((e.length+9)/64),n=new Uint8Array(r);n.set(e),n[e.length]=128;let i=8*e.length;for(let e=0;e<8;e+=1)n[r-1-e]=255&Math.floor(i/2**(8*e));let a=[0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19],l=(e,t)=>e>>>t|e<<32-t;for(let e=0;e>>3,n=l(r[e-2],17)^l(r[e-2],19)^r[e-2]>>>10;r[e]=r[e-16]+t+r[e-7]+n>>>0}let[i,o,s,d,f,u,c,y]=a;for(let e=0;e<64;e+=1){let n=l(f,6)^l(f,11)^l(f,25),a=y+n+(f&u^~f&c)+t[e]+r[e]>>>0,h=(l(i,2)^l(i,13)^l(i,22))+(i&o^i&s^o&s)>>>0;y=c,c=u,u=f,f=d+a>>>0,d=s,s=o,o=i,i=a+h>>>0}for(let[e,t]of[i,o,s,d,f,u,c,y].entries())a[e]=a[e]+t>>>0}return a.map(e=>e.toString(16).padStart(8,"0")).join("")}(d),u=figma.io&&"function"==typeof figma.io.write,c="PNG"===n&&d.length>786432;if(u&&(null!==s&&d.length>12288||c))return{kind:"devupAssetExport",fileKey:figma.fileKey||"",version:t.version,assetId:t.assetId,nodeId:t.nodeId,field:t.field,imageHash:t.imageHash,format:t.format,scale:i,status:"chunked",byteLength:d.length,sha256:f,cursor:{nextOffset:0,maxChunkBytes:12288},errorCode:null};return u&&figma.io.write(`devup-asset-${t.assetId.replace(/[^A-Za-z0-9_-]/g,"_")}.${String(t.format).toLowerCase()}`,d),{kind:"devupAssetExport",fileKey:figma.fileKey||"",version:t.version,assetId:t.assetId,nodeId:t.nodeId,field:t.field,imageHash:t.imageHash,format:t.format,scale:i,status:"exported",byteLength:d.length,sha256:f,mimeType:u?null===s?null:"image/svg+xml":({PNG:"image/png",JPG:"image/jpeg",SVG:"image/svg+xml",PDF:"application/pdf"})[n],...!u&&null===s?{data:figma.base64Encode(d)}:{},text:s,errorCode:null}}catch(e){return r("DEVUP_ASSET_EXPORT_FAILED")}},explore:async function(e){let t=await figma.getNodeByIdAsync(e.nodeId);if(!t)throw Error("DEVUP_NODE_NOT_FOUND");let r=e.explore,n=Math.max(20,Math.min(400,Number.isInteger(r.projectionLimit)?r.projectionLimit:200)),i=Math.max(0,Math.min(500,Number.isInteger(r.textPreviewLimit)?r.textPreviewLimit:160));function a(e){return"string"==typeof e?e.slice(0,240):""}let l=t,o="SECTION"===t.type?t:null;for(;l.parent&&"PAGE"!==l.parent.type;)l=l.parent,o||"SECTION"!==l.type||(o=l);let s="PAGE"===t.type?t:l.parent;if(!s||"PAGE"!==s.type)throw Error("DEVUP_PAGE_NOT_FOUND");function d(e){let t=e.absoluteBoundingBox||{x:"number"==typeof e.x?e.x:0,y:"number"==typeof e.y?e.y:0,width:"number"==typeof e.width?e.width:0,height:"number"==typeof e.height?e.height:0};return[t.x,t.y,t.width,t.height].every(Number.isFinite)?{x:t.x,y:t.y,width:t.width,height:t.height}:null}function f(e){let t=d(e);return t&&["FRAME","COMPONENT","INSTANCE","COMPONENT_SET"].includes(e.type)&&t.width>=240&&t.width<=1800&&t.height>=300&&t.height<=2e3&&t.width/Math.max(1,t.height)>=.25&&t.width/Math.max(1,t.height)<=2.5}function u(e){let t=[],r=e;for(;r&&"DOCUMENT"!==r.type&&t.length<12;){let e=a(r.name);e&&t.push(e),r=r.parent}return t.reverse()}await figma.setCurrentPageAsync(s);let c=!f(t)&&o?o:l,y=d(c)||d(t);if(!y)throw Error("DEVUP_NODE_BOUNDS_UNAVAILABLE");let h="children"in s?s.children:[],p=h.map((e,t)=>({node:e,pageChildIndex:t,bounds:d(e)})).filter(e=>e.bounds).filter(e=>{var t;return e.node.id===c.id||e.bounds.y>=y.y-240&&e.bounds.y<=y.y+12e3&&(t=e.bounds,Math.min(t.x+t.width,y.x+y.width)-Math.max(t.x,y.x)>0)}).sort((e,t)=>e.bounds.y-t.bounds.y||e.bounds.x-t.bounds.x||e.node.id.localeCompare(t.node.id)),g="SECTION"===c.type?p.filter(e=>e.node.id===c.id):p.slice(0,n),m=new Map(g.map(e=>[e.node.id,e]));m.has(l.id)||m.set(l.id,{node:l,pageChildIndex:-1,bounds:d(l)}),m.has(c.id)||m.set(c.id,{node:c,pageChildIndex:-1,bounds:d(c)}),m.has(t.id)||m.set(t.id,{node:t,pageChildIndex:-1,bounds:d(t)});let b=t.parent;for(;b&&"PAGE"!==b.type&&(m.has(b.id)||m.set(b.id,{node:b,pageChildIndex:-1,bounds:d(b)}),b.id!==c.id);)b=b.parent;if("children"in c)for(let e of c.children.slice(0,n))m.has(e.id)||m.set(e.id,{node:e,pageChildIndex:-1,bounds:d(e)});let x="SECTION"===c.type&&"children"in c&&c.children.length>n;if("SECTION"===c.type&&"children"in c){let e=8*n,t=c.children.filter(e=>!f(e)).map(e=>({node:e,ancestors:[]})),r=0;for(;t.length&&r!m.has(e.id));if(m.size+t.length>n+2){x=!0;continue}for(let e of t)m.set(e.id,{node:e,pageChildIndex:-1,bounds:d(e)});continue}if("children"in e)for(let r of e.children)t.push({node:r,ancestors:[...i,e]})}x||=t.length>0}let E=[...m.values()].filter(e=>e.bounds).slice(0,n+2).map(({node:e,pageChildIndex:t,bounds:r})=>({id:e.id,type:e.type,fields:{name:a(e.name),parentId:e.parent&&"DOCUMENT"!==e.parent.type?e.parent.id:null,childrenIds:[],x:r.x,y:r.y,width:r.width,height:r.height,childCount:"children"in e?e.children.length:0,textPreview:"",pageChildIndex:t>=0?t:null,visible:!("visible"in e)||!1!==e.visible,breadcrumb:u(e)},extra:{},fieldErrors:{}})),S=E.reduce((e,t)=>{let r=t.fields;return e?{x:Math.min(e.x,r.x),y:Math.min(e.y,r.y),right:Math.max(e.right,r.x+r.width),bottom:Math.max(e.bottom,r.y+r.height)}:{x:r.x,y:r.y,right:r.x+r.width,bottom:r.y+r.height}},null)||{x:0,y:0,right:0,bottom:0},I="SECTION"!==c.type&&p.length>g.length||m.size>n+2||x,A={id:s.id,type:s.type,fields:{name:a(s.name),parentId:null,childrenIds:[],x:S.x,y:S.y,width:S.right-S.x,height:S.bottom-S.y,childCount:h.length,textPreview:"",projectionTruncated:I,visible:!0,breadcrumb:u(s),pageChildIndex:null},extra:{},fieldErrors:{}},N={fileKey:figma.fileKey||"",version:null,rootIds:[s.id],nodes:[A,...E.filter(e=>e.id!==s.id)],diagnostics:[]},w=new Set([s.id,l.id,c.id,t.id]);for(;JSON.stringify(N).length>14e3;){let e=N.nodes.length-1;for(;e>=0&&w.has(N.nodes[e].id);)e-=1;if(e<0)break;N.nodes.splice(e,1),A.fields.projectionTruncated=!0}if(JSON.stringify(N).length>14e3&&(N.nodes=N.nodes.filter(e=>w.has(e.id)).map(e=>({...e,fields:{...e.fields,name:a(e.fields.name).slice(0,80),textPreview:"",breadcrumb:e.fields.breadcrumb.slice(-4).map(e=>e.slice(0,80)),projectionTruncated:e.id===s.id||e.fields.projectionTruncated}}))),JSON.stringify(N).length>14e3)throw Error("DEVUP_EXPLORE_PROJECTION_TOO_LARGE");let O=14e3-JSON.stringify(N).length;if(i>0&&O>0){let e=N.nodes.filter(e=>m.get(e.id)&&e.id!==s.id),t=e.length;for(let r of e){let e=Math.floor(O/t);if(t-=1,e<=0)continue;let n="",a=0;for(let t of function(e){if(0===i)return"";let t=[],r=[e],n=0;for(;r.length&&n<80&&t.join(" ").lengthe)break;n+=t,a+=r}r.fields.textPreview=n,O-=a}}return N},fastSnapshot:async function(e){let t=e.rootIds;if(!Array.isArray(t)||0===t.length)throw Error("DEVUP_ROOTS_INVALID");let r=await Promise.all(t.map(e=>figma.getNodeByIdAsync(e)));if(r.some(e=>!e))throw Error("DEVUP_NODE_NOT_FOUND");if(1===r.length&&"SECTION"===r[0].type)throw Error("DEVUP_TARGET_IS_SECTION");let n=["mobile","tablet","desktop"],i=e=>n.indexOf(String(e.name||"").trim().toLowerCase());if(1===r.length&&i(r[0])>=0){let e=r[0].parent;if(e&&"SECTION"===e.type&&"children"in e){let t=e.children.filter(e=>e.id===r[0].id||i(e)>=0).filter(e=>!1!==e.visible);t.length>1&&(r.length=0,r.push(...t))}}if(1===t.length){let e=[],t=new Set(r.map(e=>e.id)),n=[],i=e=>{if("reactions"in e&&Array.isArray(e.reactions)){for(let r of e.reactions)if(r&&r.trigger&&"AFTER_TIMEOUT"===r.trigger.type)for(let e of r.actions||[])e&&"NODE"===e.type&&e.transition&&"SMART_ANIMATE"===e.transition.type&&"string"==typeof e.destinationId&&!t.has(e.destinationId)&&(t.add(e.destinationId),n.push(e.destinationId));if("children"in e)for(let t of e.children)i(t)}};for(let e of r)i(e);for(;n.length>0;){let t=n.shift(),r=await figma.getNodeByIdAsync(t);r&&"DOCUMENT"!==r.type&&"PAGE"!==r.type&&(e.push(r),i(r))}r.push(...e)}let a=e.nodeId,l=["absoluteBoundingBox","absoluteRenderBounds","arcData","backgroundStyleId","blendMode","bottomLeftRadius","bottomRightRadius","boundVariables","characters","clipsContent","componentProperties","componentPropertyDefinitions","componentPropertyReferences","constraints","cornerRadius","counterAxisAlignItems","dashPattern","defaultVariant","effectStyleId","effects","fillStyleId","fills","fontName","fontSize","gridColumnAnchorIndex","gridColumnCount","gridColumnGap","gridColumnSizes","gridColumnSpan","gridRowAnchorIndex","gridRowCount","gridRowGap","gridRowSizes","gridRowSpan","gridStyleId","height","inferredAutoLayout","isAsset","isMask","itemSpacing","layoutGrow","layoutMode","layoutWrap","layoutPositioning","layoutSizingHorizontal","layoutSizingVertical","letterSpacing","lineHeight","maxHeight","maxLines","maxWidth","minHeight","minWidth","name","opacity","overflowDirection","paddingBottom","paddingLeft","paddingRight","paddingTop","primaryAxisAlignItems","reactions","rotation","strokeAlign","strokeBottomWeight","strokeLeftWeight","strokeRightWeight","strokeStyleId","strokeTopWeight","strokeWeight","strokes","targetAspectRatio","textAlignHorizontal","textAlignVertical","textAutoResize","textCase","textDecoration","textStyleId","textTruncation","topLeftRadius","topRightRadius","variantProperties","visible","width","x","y"],o=["fontName","fontWeight","fontSize","textDecoration","textCase","lineHeight","letterSpacing","fills","textStyleId","fillStyleId","listOptions","indentation","hyperlink"],s=e.snapshot,d=Math.max(0,Math.floor(Number(s.offset)||0)),f=Math.max(8192,Math.floor(Number(s.maxEnvelopeBytes)||19456)),u=Math.min(s.maxEnvelopeBytes?f-1024:18e3,Math.max(4096,Math.floor(Number(s.maxPayloadBytes)||15e3))),c=new Set(["backgroundStyleId","effectStyleId","fillStyleId","gridStyleId","strokeStyleId","textStyleId"]),y=new Set(["maxWidth","maxHeight","absoluteRenderBounds"]),h=new Map([["rotation",0],["cornerRadius",0],["isAsset",!1],["isMask",!1],["clipsContent",!1],["blendMode","PASS_THROUGH"],["strokeAlign","INSIDE"],["textCase","ORIGINAL"],["textDecoration","NONE"],["textAlignHorizontal","LEFT"],["textAlignVertical","TOP"],["counterAxisAlignItems","MIN"],["primaryAxisAlignItems","MIN"],["gridColumnCount",0],["gridRowCount",0],["gridColumnGap",0],["gridRowGap",0],["gridColumnAnchorIndex",-1],["gridRowAnchorIndex",-1],["gridColumnSpan",1],["gridRowSpan",1]]),p=new Set(["start","end","characters","fontWeight","textStyleId","fillStyleId","listOptions","indentation","hyperlink"]),g=new Set(["parent","children","consumers"]);function m(e,t=!1,r=new WeakSet,n=0){let i;if(null===e||["string","number","boolean"].includes(typeof e))return e;if(void 0===e)return{$undefined:!0};if("bigint"==typeof e)return{$bigint:e.toString()};if(["function","symbol"].includes(typeof e))return{$unsupported:typeof e};if(n>12)return{$truncated:"max-depth"};if("object"==typeof e&&"parent"in e&&"string"==typeof e.id&&"string"==typeof e.type)return{$nodeId:e.id,$nodeType:e.type};if(Array.isArray(e))return e.map(e=>m(e,t,r,n+1));if(ArrayBuffer.isView(e))return{$binary:e.constructor.name,byteLength:e.byteLength};if(e instanceof ArrayBuffer)return{$binary:"ArrayBuffer",byteLength:e.byteLength};if(r.has(e))return{$circular:!0};if(r.add(e),t){let t=new Set(Object.keys(e)),r=e;for(;r&&r!==Object.prototype;){for(let e of Object.getOwnPropertyNames(r))t.add(e);r=Object.getPrototypeOf(r)}i=[...t].sort().filter(e=>!e.startsWith("_")&&!g.has(e))}else i=Object.keys(e).sort();let a={};for(let l of i)try{let i=m(e[l],t,r,n+1);i&&"function"===i.$unsupported||(a[l]=i)}catch(e){a[l]=t?{$error:"unavailable"}:{$error:String(e&&e.message?e.message:e)}}return r.delete(e),a}let b=[],x=[...r],E=new Set;for(let e=0;e=b.length&&b.length>0)throw Error("DEVUP_SNAPSHOT_RANGE_INVALID");function S(e){let t=0;for(let r=0;r=55296&&n<=56319&&r+1({id:e,styleType:t})).sort((e,t)=>e.id.localeCompare(t.id)),a=await Promise.all([...n.map(async e=>{try{let t=await figma.variables.getVariableByIdAsync(e);return t?{kind:"variable",value:m(t,!0),collectionId:t.variableCollectionId}:{kind:"unresolved",value:{id:e,kind:"variable",reason:"notFoundOrUnavailable"}}}catch(t){return{kind:"unresolved",value:{id:e,kind:"variable",reason:"notFoundOrUnavailable"}}}}),...i.map(async({id:e,styleType:t})=>{try{let r=await figma.getStyleByIdAsync(e);if(!r)return{kind:"unresolved",value:{id:e,kind:"style",reason:"notFoundOrUnavailable"}};return{kind:"style",value:{...m(r,!0),styleType:t,value:m("PAINT"===t?r.paints:"EFFECT"===t?r.effects:"GRID"===t?r.layoutGrids:r,!0)}}}catch(t){return{kind:"unresolved",value:{id:e,kind:"style",reason:"notFoundOrUnavailable"}}}})]),l=[...new Set(a.filter(e=>"variable"===e.kind&&e.collectionId).map(e=>e.collectionId))].sort(),o=(await Promise.all(l.map(async e=>{try{let t=await figma.variables.getVariableCollectionByIdAsync(e);return t?m(t,!0):null}catch(e){return null}}))).filter(e=>null!==e),s=a.filter(e=>"variable"===e.kind).map(e=>e.value),d=a.filter(e=>"style"===e.kind).map(e=>e.value),f=a.filter(e=>"unresolved"===e.kind).map(e=>e.value);return{collections:o,variables:s,styles:d,usedRemoteVariables:s.filter(e=>!0===e.remote),usedVariableIds:n,usedStyleIds:i.map(e=>e.id),localComplete:!1,usedRemoteComplete:0===f.length,unresolved:f,$variableRefCount:n.length,$styleRefCount:i.length}}let A=u-1024,N=null;for(let e=0;e<5;e+=1){let{pageNodes:e,packedBytes:t}=function(e){let t=[],r=2;for(let n=d;ne.id):[];for(let i of(n.length>0&&(t.childrenIds=n),l)){let n;try{if(!(i in e)){"overflowDirection"===i&&["FRAME","COMPONENT","INSTANCE","COMPONENT_SET"].includes(e.type)&&(t[i]=null);continue}if(n=e[i],"function"==typeof n)continue;let r=m(n);if("overflowDirection"===i&&null==n){t[i]=null;continue}(null===r?!y.has(i):Array.isArray(r)?0===r.length:"object"==typeof r?0===Object.keys(r).length:!!(""===r&&c.has(i))||h.has(i)&&h.get(i)===r)||(t[i]=r)}catch(e){r[i]=String(e&&e.message?e.message:e)}}if("TEXT"===e.type&&"function"==typeof e.getStyledTextSegments)try{let r=m(e.getStyledTextSegments(o));if(1===r.length){let e=r[0];for(let t of Object.keys(e))p.has(t)||delete e[t]}r.length>0&&(t.styledTextSegments=r)}catch(e){r.styledTextSegments=String(e&&e.message?e.message:e)}let i={id:e.id,type:e.type,fields:t};return Object.keys(r).length>0&&(i.fieldErrors=r),i}(b[n]),a=S(JSON.stringify(i))+ +!!t.length;if(t.length&&r+a>e)break;t.push(i),r+=a}return{pageNodes:t,packedBytes:r}}(A);if(0===e.length)throw Error("DEVUP_SNAPSHOT_RANGE_INVALID");let n=function(e,t){let n=Math.min(b.length,d+e.length),{$variableRefCount:i,$styleRefCount:l,...o}=t,s=[...e,{id:"__DEVUP_SNAPSHOT_CURSOR__",type:"DEVUP_INTERNAL",fields:{offset:d,nextOffset:n,complete:n>=b.length,totalNodes:b.length},extra:{},fieldErrors:{}}],f={kind:"devupFastSnapshotEnvelope",schemaVersion:1,source:{fileKey:figma.fileKey||"",rootId:a},snapshot:{fileKey:figma.fileKey||"",version:null,rootIds:r.map(e=>e.id),nodes:s,diagnostics:[]},resources:o,integrity:{nodeCount:s.length,variableRefCount:i,styleRefCount:l,utf8Bytes:0}},u=0;for(let e=0;e<8&&(u=S(JSON.stringify(f)),f.integrity.utf8Bytes!==u);e+=1)f.integrity.utf8Bytes=u;if(f.integrity.utf8Bytes!==S(JSON.stringify(f)))throw Error("DEVUP_ENVELOPE_LENGTH_UNSTABLE");return{envelope:f,bytes:u}}(e,await I(e));if(n.bytes<=f){N=n;break}if(1===e.length)throw Error("DEVUP_ENVELOPE_TOO_LARGE");A=Math.max(1,Math.min(A-1,t-(n.bytes-f)-256))}if(!N)throw Error("DEVUP_ENVELOPE_TOO_LARGE");return N.envelope},fastTheme:async function(e){let t=Math.max(0,Math.floor(Number(e.theme.offset)||0));function r(e,t=new WeakSet,n=0){if(null===e||["string","number","boolean"].includes(typeof e))return e;if(void 0===e)return{$undefined:!0};if("bigint"==typeof e)return{$bigint:e.toString()};if(["function","symbol"].includes(typeof e))return{$unsupported:typeof e};if(n>12)return{$truncated:"max-depth"};if("object"==typeof e&&"parent"in e&&"string"==typeof e.id&&"string"==typeof e.type)return{$nodeId:e.id,$nodeType:e.type};if(Array.isArray(e))return e.map(e=>r(e,t,n+1));if(ArrayBuffer.isView(e))return{$binary:e.constructor.name,byteLength:e.byteLength};if(e instanceof ArrayBuffer)return{$binary:"ArrayBuffer",byteLength:e.byteLength};if(t.has(e))return{$circular:!0};t.add(e);let i={};for(let a of function(e){let t=new Set(Object.keys(e)),r=e;for(;r&&r!==Object.prototype;){for(let e of Object.getOwnPropertyNames(r))t.add(e);r=Object.getPrototypeOf(r)}return[...t].sort()}(e))if(!(a.startsWith("_")||["parent","children","consumers"].includes(a)))try{let l=r(e[a],t,n+1);l&&"function"===l.$unsupported||(i[a]=l)}catch(e){i[a]={$error:"unavailable"}}return t.delete(e),i}let n=new Set,i=new Map;for(let e of[figma.root,...figma.root.findAll(()=>!0)])for(let t of["boundVariables","fills","strokes","effects","layoutGrids","textStyleId","fillStyleId","strokeStyleId","backgroundStyleId","effectStyleId","gridStyleId"])try{!function e(t,r="",a=new WeakSet,l=0){if(!(l>16)&&null!==t&&"object"==typeof t&&!a.has(t)){if(a.add(t),Array.isArray(t)){for(let n of t)e(n,r,a,l+1);return}for(let[o,s]of("VARIABLE_ALIAS"===t.type&&"string"==typeof t.id&&t.id&&"figma.mixed"!==t.id&&"MIXED"!==t.id&&n.add(t.id),Object.entries(t))){let t="textStyleId"===o?"TEXT":["fillStyleId","strokeStyleId","backgroundStyleId"].includes(o)?"PAINT":"effectStyleId"===o?"EFFECT":"gridStyleId"===o?"GRID":null;t&&"string"==typeof s&&s&&"figma.mixed"!==s&&"MIXED"!==s&&!i.has(s)&&i.set(s,t),e(s,o||r,a,l+1)}}}({[t]:e[t]})}catch(e){}let[a,l,o,s,d,f]=await Promise.all([figma.variables.getLocalVariableCollectionsAsync(),figma.variables.getLocalVariablesAsync(),figma.getLocalPaintStylesAsync(),figma.getLocalTextStylesAsync(),figma.getLocalEffectStylesAsync(),figma.getLocalGridStylesAsync()]),u=new Set(l.map(e=>e.id)),c=new Set([...o,...s,...d,...f].map(e=>e.id)),y=[],h=[...n].filter(e=>!u.has(e)).sort().map(async e=>{try{return await figma.variables.getVariableByIdAsync(e)||null}catch(t){return y.push({id:e,kind:"variable",reason:"notFoundOrUnavailable"}),null}}),p=[...i.entries()].filter(([e])=>!c.has(e)).sort(([e],[t])=>e.localeCompare(t)).map(async([e,t])=>{try{let r=await figma.getStyleByIdAsync(e);return r?{style:r,styleType:t}:null}catch(t){return y.push({id:e,kind:"style",reason:"notFoundOrUnavailable"}),null}}),g=(await Promise.all(h)).filter(Boolean),m=(await Promise.all(p)).filter(Boolean);for(let e of[...n].filter(e=>!u.has(e)))g.some(t=>t.id===e)||y.some(t=>t.id===e)||y.push({id:e,kind:"variable",reason:"notFoundOrUnavailable"});for(let[e]of[...i.entries()].filter(([e])=>!c.has(e)))m.some(t=>t.style.id===e)||y.some(t=>t.id===e)||y.push({id:e,kind:"style",reason:"notFoundOrUnavailable"});let b=[...new Set(g.map(e=>e.variableCollectionId))].filter(e=>!a.some(t=>t.id===e)).sort(),x=(await Promise.all(b.map(async e=>{try{return await figma.variables.getVariableCollectionByIdAsync(e)}catch(e){return null}}))).filter(Boolean);function E(e,t){return{...r(e),styleType:t,value:r("PAINT"===t?e.paints:"EFFECT"===t?e.effects:"GRID"===t?e.layoutGrids:e)}}let S=[...o.map(e=>E(e,"PAINT")),...s.map(e=>E(e,"TEXT")),...d.map(e=>E(e,"EFFECT")),...f.map(e=>E(e,"GRID")),...m.map(({style:e,styleType:t})=>E(e,t))].sort((e,t)=>e.id.localeCompare(t.id)),I=[...l,...g].map(e=>r(e)).sort((e,t)=>e.id.localeCompare(t.id)),A=[...a,...x].map(e=>r(e)).sort((e,t)=>e.id.localeCompare(t.id));function N(e){let t=[];for(let r=0;r=55296&&n<=56319){let t=r+1=56320&&t<=57343?(n=65536+(n-55296<<10)+(t-56320),r+=1):n=65533}else n>=56320&&n<=57343&&(n=65533);n<128?t.push(n):n<2048?t.push(192|n>>6,128|63&n):n<65536?t.push(224|n>>12,128|n>>6&63,128|63&n):t.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n)}return new Uint8Array(t)}y.sort((e,t)=>e.kind.localeCompare(t.kind)||e.id.localeCompare(t.id));let w=[...A.map(e=>({kind:"collection",value:e})),...I.map(e=>({kind:"variable",value:e})),...S.map(e=>({kind:"style",value:e})),...[...n].sort().map(e=>({kind:"usedVariableId",value:e})),...[...i.keys()].sort().map(e=>({kind:"usedStyleId",value:e})),...y.map(e=>({kind:"unresolved",value:e}))];if(t>w.length)throw Error("DEVUP_SNAPSHOT_RANGE_INVALID");let O=w.map(e=>N(JSON.stringify(e.value)).length+1),T=18432,v=null;for(let e=0;e<6;e+=1){let{pageItems:e,packed:r}=function(e){let r=[],n=0;for(let i=t;i0)||!(n+O[i]>e));i+=1)r.push(w[i]),n+=O[i];return{pageItems:r,packed:n}}(T),n=function(e,r){let n=t=>e.filter(e=>e.kind===t).map(e=>e.value),i=n("collection"),a=n("variable"),l=n("style"),o=n("unresolved"),s={kind:"devupFastThemeEnvelope",schemaVersion:1,source:{fileKey:figma.fileKey||"",version:null},resources:{collections:i,variables:a,styles:l,usedRemoteVariables:[],usedVariableIds:n("usedVariableId"),usedStyleIds:n("usedStyleId"),localComplete:!0,usedRemoteComplete:0===y.length,unresolved:o},page:{offset:t,nextOffset:r,complete:r>=w.length,totalItems:w.length},integrity:{collectionCount:i.length,variableCount:a.length,styleCount:l.length,unresolvedCount:o.length,utf8Bytes:0}},d=new Uint8Array;for(let e=0;e<8&&(d=N(JSON.stringify(s)),s.integrity.utf8Bytes!==d.length);e+=1)s.integrity.utf8Bytes=d.length;if(d=N(JSON.stringify(s)),s.integrity.utf8Bytes!==d.length)throw Error("DEVUP_ENVELOPE_LENGTH_UNSTABLE");return{envelope:s,bytes:d.length}}(e,t+e.length);if(n.bytes<=19456){v=n;break}if(e.length<=1)break;T=Math.max(1,Math.min(T-1,r-(n.bytes-19456)-256))}if(null===v||v.bytes>8388608)throw Error("DEVUP_ENVELOPE_TOO_LARGE");return v.envelope},largeValue:async function(e){let t,r=e.largeValue,n=await figma.getNodeByIdAsync(r.nodeId);if(!n)throw Error("DEVUP_NODE_NOT_FOUND");function i(e){let t=[];for(let r=0;r=55296&&n<=56319){let t=r+1=56320&&t<=57343?(n=65536+(n-55296<<10)+(t-56320),r+=1):n=65533}else n>=56320&&n<=57343&&(n=65533);n<128?t.push(n):n<2048?t.push(192|n>>6,128|63&n):n<65536?t.push(224|n>>12,128|n>>6&63,128|63&n):t.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n)}return new Uint8Array(t)}let a=null;try{if("$export:svg"===r.field){if("function"!=typeof n.exportAsync)throw Error("unsupported");let e=await n.exportAsync({format:"SVG_STRING"});if("string"!=typeof e)throw Error("unsupported");a=i(e)}else if("string"==typeof r.field&&r.field.startsWith("$export:png")){if("function"!=typeof n.exportAsync)throw Error("unsupported");let e=Math.min(4,Math.max(1,Math.floor(Number(r.field.split("@")[1])||1))),t=await n.exportAsync({format:"PNG",constraint:{type:"SCALE",value:e}});a=t instanceof Uint8Array?t:new Uint8Array(t)}else if("styledTextSegments"===r.field&&"TEXT"===n.type&&"function"==typeof n.getStyledTextSegments)t=n.getStyledTextSegments(["fontName","fontWeight","fontSize","textDecoration","textCase","lineHeight","letterSpacing","fills","textStyleId","fillStyleId","listOptions","indentation","hyperlink"]);else if(r.field in n)t=n[r.field];else throw Error("unsupported")}catch(e){return{kind:"devupLargeValueUnsupported",fileKey:figma.fileKey||"",version:r.version,nodeId:r.nodeId,field:r.field,byteLength:r.byteLength,sha256:r.sha256,errorCode:"DEVUP_FIELD_UNSUPPORTED_BY_UPSTREAM"}}let l=null===a?i(JSON.stringify(function e(t,r=new WeakSet,n=0){if(null===t||["string","number","boolean"].includes(typeof t))return t;if(void 0===t)return{$undefined:!0};if("bigint"==typeof t)return{$bigint:t.toString()};if(["function","symbol"].includes(typeof t))return{$unsupported:typeof t};if(n>12)return{$truncated:"max-depth"};if("object"==typeof t&&"parent"in t&&"string"==typeof t.id&&"string"==typeof t.type)return{$nodeId:t.id,$nodeType:t.type};if(Array.isArray(t))return t.map(t=>e(t,r,n+1));if(ArrayBuffer.isView(t))return{$binary:t.constructor.name,byteLength:t.byteLength};if(t instanceof ArrayBuffer)return{$binary:"ArrayBuffer",byteLength:t.byteLength};if(r.has(t))return{$circular:!0};r.add(t);let i={};for(let a of Object.keys(t).sort())try{let l=e(t[a],r,n+1);l&&"function"===l.$unsupported||(i[a]=l)}catch(e){i[a]={$error:String(e&&e.message?e.message:e)}}return r.delete(t),i}(t))):a,o=function(e){let t=[0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,0xe49b69c1,0xefbe4786,0xfc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x6ca6351,0x14292967,0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2],r=e.length,n=64*Math.ceil((r+9)/64),i=new Uint8Array(n);i.set(e),i[r]=128;let a=8*r;for(let e=0;e<8;e+=1)i[n-1-e]=255&Math.floor(a/2**(8*e));let l=[0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19],o=(e,t)=>e>>>t|e<<32-t;for(let e=0;e>>3,n=o(r[e-2],17)^o(r[e-2],19)^r[e-2]>>>10;r[e]=r[e-16]+t+r[e-7]+n>>>0}let[n,a,s,d,f,u,c,y]=l;for(let e=0;e<64;e+=1){let i=y+(o(f,6)^o(f,11)^o(f,25))+(f&u^~f&c)+t[e]+r[e]>>>0,l=(o(n,2)^o(n,13)^o(n,22))+(n&a^n&s^a&s)>>>0;y=c,c=u,u=f,f=d+i>>>0,d=s,s=a,a=n,n=i+l>>>0}for(let[e,t]of[n,a,s,d,f,u,c,y].entries())l[e]=l[e]+t>>>0}return l.map(e=>e.toString(16).padStart(8,"0")).join("")}(l);if(l.length!==r.byteLength||o!==r.sha256)throw Error("DEVUP_LARGE_VALUE_CHANGED");let s=Math.max(0,Math.floor(Number(r.offset)||0)),d=Math.min(65536,Math.max(1,Math.floor(Number(r.maxChunkBytes)||8192)));if(s>=l.length)throw Error("DEVUP_LARGE_VALUE_RANGE_INVALID");let f=Math.min(l.length,s+d);return{kind:"devupLargeValueFragment",fileKey:figma.fileKey||"",version:r.version,nodeId:r.nodeId,field:r.field,offset:s,nextOffset:f,byteLength:l.length,sha256:o,dataBase64:function(e){let t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",r="";for(let n=0;n>2],r+=t[(3&i)<<4|a>>4],r+=n+1>6]:"=",r+=n+2e.id),nodes:t.map(e=>({id:e.id,type:e.type,fields:{name:e.name,parentId:null,childrenIds:[]},extra:{},fieldErrors:{}})),diagnostics:[]}},search:async function(e){let t=await figma.getNodeByIdAsync(e.nodeId);if(!t)throw Error("DEVUP_NODE_NOT_FOUND");let r=t;for(;r&&"PAGE"!==r.type;)r=r.parent;if(!r||"PAGE"!==r.type)throw Error("DEVUP_PAGE_NOT_FOUND");await figma.setCurrentPageAsync(r);let n=e.search,i=new Set((n.nodeTypes.length?n.nodeTypes:["PAGE","SECTION","FRAME","COMPONENT_SET","COMPONENT"]).map(e=>e.toUpperCase()));function a(e){return e.normalize("NFC").toLocaleLowerCase().replace(/\s/gu,"")}let l=t===r?r.findAll(()=>!0):"findAll"in t?t.findAll(()=>!0):[],o=[t,...l].filter(e=>i.has(e.type)&&"string"==typeof e.name).map(e=>({node:e,score:function(e){if(e===n.query)return 400;if("exact"===n.matchKind)return null;let t=a(e),r=a(n.query);if(t===r)return 300;if(t.startsWith(r))return 200;if(t.includes(r))return 100;if("fuzzy"!==n.matchKind)return null;let i=function(e,t){let r=Array.from({length:t.length+1},(e,t)=>t);for(let n=0;nnull!==e.score).sort((e,t)=>t.score-e.score||e.node.name.localeCompare(t.node.name)||e.node.id.localeCompare(t.node.id)).slice(0,n.limit),s=new Map([[r.id,r]]);for(let e of[t,...o.map(e=>e.node)]){let t=e;for(;t&&"DOCUMENT"!==t.type;)s.set(t.id,t),t=t.parent}return{fileKey:figma.fileKey||"",version:null,rootIds:[r.id],nodes:[...s.values()].map(e=>({id:e.id,type:e.type,fields:{name:e.name,parentId:e.parent&&"DOCUMENT"!==e.parent.type?e.parent.id:null,childrenIds:"children"in e?e.children.map(e=>e.id):[]},extra:{},fieldErrors:{}})),diagnostics:[]}},sectionIndex:async function(e){let t=await figma.getNodeByIdAsync(e.nodeId);if(!t)throw Error("DEVUP_NODE_NOT_FOUND");if("SECTION"!==t.type){let e=t.parent,r=new Set;for(;e&&"SECTION"!==e.type&&!r.has(e.id);)r.add(e.id),e=e.parent;let n=e&&"SECTION"===e.type?e.id:null,i=n&&figma.fileKey?`https://www.figma.com/design/${figma.fileKey}?node-id=${n.replace(/:/g,"-")}`:null;throw Error("DEVUP_SECTION_REQUIRED "+JSON.stringify({pluginCode:"DEVUP_SECTION_REQUIRED",stage:"section-index",nodeId:t.id,nodeType:t.type,sectionId:n,nextAction:{tool:"devup_figma_export",how:n?`The url must point to a SECTION. This capture's SECTION is ${n}; select frames with frameIds.`:"The url must point to a SECTION. This node has no ancestor SECTION; choose the intended SECTION in Figma and copy its link.",arguments:i?"FRAME"===t.type&&t.parent===e?{url:i,frameIds:[t.id]}:{url:i}:null,requiredArguments:i?[]:["url"]}}))}let r=2048;function n(e){let t=e.absoluteBoundingBox||{x:"number"==typeof e.x?e.x:0,y:"number"==typeof e.y?e.y:0,width:"number"==typeof e.width?e.width:0,height:"number"==typeof e.height?e.height:0};return[t.x,t.y,t.width,t.height].every(Number.isFinite)?{x:t.x,y:t.y,width:t.width,height:t.height}:null}function i(e,t){if("FRAME"!==e.type||!1===e.visible||!t)return!1;let r=t.width/Math.max(1,t.height);return t.width>=240&&t.width<=1800&&t.height>=300&&t.height<=2e3&&r>=.25&&r<=2.5}function a(e){let t=0;for(let r=0;r=55296&&n<=56319&&r+1[e.id,t.id])),s=[],d=0;for(let e=0;ee.id));for(let r of t.children){if(e.has(r.id))continue;let t=n(r);t&&!1!==r.visible&&s.push({node:r,box:t})}}s.sort((e,t)=>e.box.y-t.box.y||e.box.x-t.box.x||e.node.id.localeCompare(t.node.id));let f=l.length>d||s.length>100,u=s.slice(0,100),c=new Set(u.map(({node:e})=>e.id)),y=new Set(e.rootIds),h={},p=new Map([[t.id,null]]);for(let e=0;e{let r=e.parent;for(;r&&r.id!==t.id&&!c.has(r.id);)r=r.parent;return[e.id,r&&c.has(r.id)?r.id:t.id]})),m=e=>u.filter(({node:t})=>g.get(t.id)===e).map(({node:e})=>e.id),b=n(t);if(!b)throw Error("DEVUP_NODE_BOUNDS_UNAVAILABLE");let x={id:t.id,type:t.type,fields:{name:t.name,parentId:t.parent&&"DOCUMENT"!==t.parent.type?t.parent.id:null,childrenIds:m(t.id),absoluteBoundingBox:b,visible:!1!==t.visible,projectionTruncated:f,nodeScreenIds:h},extra:{},fieldErrors:{}},E=u.length,S=u.map(({node:e,box:t})=>{let n=function(e){let t=[e],r=0,n=0;for(let e=0;er}}(e),l=Math.floor(r/E);E-=1;let o=function(e,t){let r=[e],n="",i=0,l=0,o=!1;if(t<=0)return{text:"",state:"budget-exhausted",spent:0};for(let e=0;e=120||l+e>t)return{text:n.trimEnd(),state:l+e>t?"budget-exhausted":"truncated",spent:l};n+=r,i+=1,l+=e}}if("children"in s){let e=Math.max(0,64-r.length);s.children.length>e&&(o=!0),r.push(...s.children.slice(0,e))}}}return{text:n,state:o?"truncated":n?"available":"no-text",spent:l}}(e,l);return r-=o.spent,{id:e.id,type:e.type,fields:{name:"string"==typeof e.name?e.name:"",parentId:g.get(e.id),childrenIds:m(e.id),absoluteBoundingBox:t,visible:!1!==e.visible,breadcrumb:function(e){let t=[],r=e;for(;r&&"DOCUMENT"!==r.type;)"string"==typeof r.name&&r.name&&t.push(r.name),r=r.parent;return t.reverse()}(e),directChildCount:"children"in e?e.children.length:0,textPreview:o.text,textPreviewState:o.state,subtreeNodeCount:n.subtreeNodeCount,estimatedSerializedBytes:n.estimatedSerializedBytes,selectionReasons:[i(e,t)?"screen-like":"explicit-selection-only","inside-section"],estimateTruncated:n.truncated},extra:{},fieldErrors:{}}}),I={fileKey:figma.fileKey||"",version:null,rootIds:[t.id],nodes:[x,...S],diagnostics:[]},A=a(JSON.stringify(I));for(let e=S.length-1;e>=0&&A>19456;e-=1)S[e].fields.textPreview="",S[e].fields.textPreviewState="budget-exhausted",A=a(JSON.stringify(I));if(A>19456)throw Error("DEVUP_SECTION_INDEX_TOO_LARGE "+JSON.stringify({pluginCode:"DEVUP_SECTION_INDEX_TOO_LARGE",stage:"section-index",responseBytes:A,maxResponseBytes:19456}));return I},snapshot:async function(e){let t=await figma.getNodeByIdAsync(e.nodeId);if(!t)throw Error("DEVUP_NODE_NOT_FOUND");let r=["absoluteBoundingBox","absoluteRenderBounds","arcData","backgroundStyleId","blendMode","bottomLeftRadius","bottomRightRadius","boundVariables","characters","clipsContent","componentProperties","componentPropertyDefinitions","componentPropertyReferences","constraints","cornerRadius","counterAxisAlignItems","dashPattern","defaultVariant","effectStyleId","effects","fillStyleId","fills","fontName","fontSize","gridColumnAnchorIndex","gridColumnCount","gridColumnGap","gridColumnSizes","gridColumnSpan","gridRowAnchorIndex","gridRowCount","gridRowGap","gridRowSizes","gridRowSpan","gridStyleId","height","inferredAutoLayout","isAsset","isMask","itemSpacing","layoutGrow","layoutMode","layoutWrap","layoutPositioning","layoutSizingHorizontal","layoutSizingVertical","letterSpacing","lineHeight","maxHeight","maxLines","maxWidth","minHeight","minWidth","name","opacity","overflowDirection","paddingBottom","paddingLeft","paddingRight","paddingTop","primaryAxisAlignItems","reactions","rotation","strokeAlign","strokeBottomWeight","strokeLeftWeight","strokeRightWeight","strokeStyleId","strokeTopWeight","strokeWeight","strokes","targetAspectRatio","textAlignHorizontal","textAlignVertical","textAutoResize","textCase","textDecoration","textStyleId","textTruncation","topLeftRadius","topRightRadius","variantProperties","visible","width","x","y"],n=new Set(r),i=["fontName","fontWeight","fontSize","textDecoration","textCase","lineHeight","letterSpacing","fills","textStyleId","fillStyleId","listOptions","indentation","hyperlink"],a=e.snapshot,l=Math.max(0,Math.floor(Number(a.offset)||0)),o=Math.min(a.maxEnvelopeBytes?Math.max(8192,Math.floor(Number(a.maxEnvelopeBytes))):16e3,Math.max(4096,Math.floor(Number(a.maxPayloadBytes)||15e3))),s=Math.min(o-1024,Math.max(512,Math.floor(Number(a.maxFieldBytes)||4096))),d=new Set(["id","type","parent","children"]),f=new Set(["parentId","childrenIds","name","characters","styledTextSegments","boundVariables"]);function u(e,t,r){let n=function(e){let t=[];for(let r=0;r=55296&&n<=56319){let t=r+1=56320&&t<=57343?(n=65536+(n-55296<<10)+(t-56320),r+=1):n=65533}else n>=56320&&n<=57343&&(n=65533);n<128?t.push(n):n<2048?t.push(192|n>>6,128|63&n):n<65536?t.push(224|n>>12,128|n>>6&63,128|63&n):t.push(240|n>>18,128|n>>12&63,128|n>>6&63,128|63&n)}return new Uint8Array(t)}(JSON.stringify(r));return n.length>0x1000000?{$truncated:"max-large-value-bytes",byteLength:n.length}:{$largeValue:{nodeId:e,field:t,byteLength:n.length,sha256:function(e){let t=[0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,0xe49b69c1,0xefbe4786,0xfc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x6ca6351,0x14292967,0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2],r=64*Math.ceil((e.length+9)/64),n=new Uint8Array(r);n.set(e),n[e.length]=128;let i=8*e.length;for(let e=0;e<8;e+=1)n[r-1-e]=255&Math.floor(i/2**(8*e));let a=[0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19],l=(e,t)=>e>>>t|e<<32-t;for(let e=0;e>>3,n=l(r[e-2],17)^l(r[e-2],19)^r[e-2]>>>10;r[e]=r[e-16]+t+r[e-7]+n>>>0}let[i,o,s,d,f,u,c,y]=a;for(let e=0;e<64;e+=1){let n=y+(l(f,6)^l(f,11)^l(f,25))+(f&u^~f&c)+t[e]+r[e]>>>0,a=(l(i,2)^l(i,13)^l(i,22))+(i&o^i&s^o&s)>>>0;y=c,c=u,u=f,f=d+n>>>0,d=s,s=o,o=i,i=n+a>>>0}for(let[e,t]of[i,o,s,d,f,u,c,y].entries())a[e]=a[e]+t>>>0}return a.map(e=>e.toString(16).padStart(8,"0")).join("")}(n),cursor:{nextOffset:0,maxChunkBytes:12288}}}}function c(e){return function(e){let t=0;for(let r=0;r=55296&&n<=56319&&r+112)return{$truncated:"max-depth"};if("object"==typeof t&&"parent"in t&&"string"==typeof t.id&&"string"==typeof t.type)return{$nodeId:t.id,$nodeType:t.type};if(Array.isArray(t))return t.map(t=>e(t,r,n+1));if(ArrayBuffer.isView(t))return{$binary:t.constructor.name,byteLength:t.byteLength};if(t instanceof ArrayBuffer)return{$binary:"ArrayBuffer",byteLength:t.byteLength};if(r.has(t))return{$circular:!0};r.add(t);let i={};for(let a of Object.keys(t).sort())try{let l=e(t[a],r,n+1);l&&"function"===l.$unsupported||(i[a]=l)}catch(e){i[a]={$error:String(e&&e.message?e.message:e)}}return r.delete(t),i}(r),a=c(i);if(a<=s)return i;let l=u(e,t,i);return l.$truncated&&(n[t]=`DEVUP_FIELD_VALUE_UNSUPPORTED:${a}>16777216`),l}let h=[],p=[t];for(;p.length;){let e=p.shift();h.push(e),"children"in e&&p.push(...e.children)}let g=[],m=o-1024,b=2;for(let e=l;eNumber(e.protected)-Number(t.protected)||t.byteLength-e.byteLength),n)){if(r<=t)break;let n=u(e.id,i.name,e[i.sectionName][i.name]);e[i.sectionName][i.name]=n,n.$truncated&&(e.fieldErrors[i.name]=`DEVUP_FIELD_VALUE_UNSUPPORTED:${i.byteLength}>16777216`),r=c(e)}return e}(function(e){let t={},a={},l={};for(let i of(t.parentId=e.parent?e.parent.id:null,e.parent&&("PAGE"===e.parent.type||"SECTION"===e.parent.type||"COMPONENT_SET"===e.parent.type)&&(t.parentType=e.parent.type,"SECTION"===e.parent.type&&(t.parentName=e.parent.name)),t.childrenIds="children"in e?e.children.map(e=>e.id):[],!("overflowDirection"in e)&&["FRAME","COMPONENT","INSTANCE","COMPONENT_SET"].includes(e.type)&&(t.overflowDirection=null),function(e){let t=new Set,n=e;for(;n&&n!==Object.prototype;){for(let e of Object.getOwnPropertyNames(n))t.add(e);n=Object.getPrototypeOf(n)}for(let n of r)try{n in e&&t.add(n)}catch(e){}return[...t].sort()}(e)))if(!(d.has(i)||i.startsWith("_")))try{let r=e[i];if("function"==typeof r)continue;let o=y(e.id,i,r,l);(n.has(i)?t:a)[i]=o}catch(e){l[i]=String(e&&e.message?e.message:e)}if("TEXT"===e.type&&"function"==typeof e.getStyledTextSegments)try{t.styledTextSegments=y(e.id,"styledTextSegments",e.getStyledTextSegments(i),l)}catch(e){l.styledTextSegments=String(e&&e.message?e.message:e)}return{id:e.id,type:e.type,fields:t,extra:a,fieldErrors:l}}(h[e]),m),a=c(t)+ +!!g.length;if(g.length&&b+a>m)break;g.push(t),b+=a}let x=Math.min(h.length,l+g.length);return g.push({id:"__DEVUP_SNAPSHOT_CURSOR__",type:"DEVUP_INTERNAL",fields:{offset:l,nextOffset:x,complete:x>=h.length,totalNodes:h.length},extra:{},fieldErrors:{}}),{fileKey:figma.fileKey||"",version:null,rootIds:[t.id],nodes:g,diagnostics:[]}},usedResources:async function(e){let t=e.resources;function r(e,t=new WeakSet,n=0){if(null===e||["string","number","boolean"].includes(typeof e))return e;if(void 0===e)return{$undefined:!0};if("bigint"==typeof e)return{$bigint:e.toString()};if(["function","symbol"].includes(typeof e))return{$unsupported:typeof e};if(n>12)return{$truncated:"max-depth"};if("object"==typeof e&&"parent"in e&&"string"==typeof e.id&&"string"==typeof e.type)return{$nodeId:e.id,$nodeType:e.type};if(Array.isArray(e))return e.map(e=>r(e,t,n+1));if(ArrayBuffer.isView(e))return{$binary:e.constructor.name,byteLength:e.byteLength};if(e instanceof ArrayBuffer)return{$binary:"ArrayBuffer",byteLength:e.byteLength};if(t.has(e))return{$circular:!0};t.add(e);let i={},a=new Set(Object.keys(e)),l=e;for(;l&&l!==Object.prototype;){for(let e of Object.getOwnPropertyNames(l))a.add(e);l=Object.getPrototypeOf(l)}for(let l of[...a].sort())if(!(l.startsWith("_")||["parent","children","consumers"].includes(l)))try{let a=r(e[l],t,n+1);a&&"function"===a.$unsupported||(i[l]=a)}catch(e){i[l]={$error:"unavailable"}}return t.delete(e),i}let n=new Map,i="ok";try{for(let e of(await figma.variables.getLocalVariablesAsync()))n.set(e.id,e)}catch(e){i="unavailable"}let a=await Promise.all(t.variableIds.map(async e=>{let t=n.get(e);if(t)return{value:r(t),collectionId:t.variableCollectionId};try{let t=await figma.variables.getVariableByIdAsync(e);return t?{value:r(t),collectionId:t.variableCollectionId}:{unresolved:{id:e,kind:"variable",reason:"notInFileAndLookupEmpty"}}}catch(t){return{unresolved:{id:e,kind:"variable",reason:"notInFileAndLookupThrew"}}}})),l=[...new Set(a.flatMap(e=>e.collectionId?[e.collectionId]:[]))].sort(),o=await Promise.all(l.map(async e=>{try{let t=await figma.variables.getVariableCollectionByIdAsync(e);return t?[r(t)]:[]}catch(e){return[]}})),s=await Promise.all(t.styles.map(async e=>{try{let t=await figma.getStyleByIdAsync(e.id);if(!t)return{unresolved:{id:e.id,kind:"style",reason:"notFoundOrUnavailable"}};return{value:{...r(t),styleType:e.styleType,value:r("PAINT"===e.styleType?t.paints:"EFFECT"===e.styleType?t.effects:"GRID"===e.styleType?t.layoutGrids:t)}}}catch(t){return{unresolved:{id:e.id,kind:"style",reason:"notFoundOrUnavailable"}}}}));return{collections:o.flat(),variables:a.flatMap(e=>e.value?[e.value]:[]),styles:s.flatMap(e=>e.value?[e.value]:[]),usedVariableIds:t.variableIds,usedStyleIds:t.styles.map(e=>e.id),localVariableListing:i,localVariableCount:n.size,unresolved:[...a,...s].flatMap(e=>e.unresolved?[e.unresolved]:[])}},variableCatalog:async function(e){let[t,r,n,i,a]=await Promise.all([figma.variables.getLocalVariableCollectionsAsync(),figma.getLocalPaintStylesAsync(),figma.getLocalTextStylesAsync(),figma.getLocalEffectStylesAsync(),figma.getLocalGridStylesAsync()]),l=["PAINT","TEXT","EFFECT","GRID"];return{collections:t.map(e=>(function e(t,r=new WeakSet,n=0){if(null===t||["string","number","boolean"].includes(typeof t))return t;if(void 0===t)return{$undefined:!0};if("bigint"==typeof t)return{$bigint:t.toString()};if(["function","symbol"].includes(typeof t))return{$unsupported:typeof t};if(n>12)return{$truncated:"max-depth"};if(Array.isArray(t))return t.map(t=>e(t,r,n+1));if(r.has(t))return{$circular:!0};r.add(t);let i={},a=new Set(Object.keys(t)),l=t;for(;l&&l!==Object.prototype;){for(let e of Object.getOwnPropertyNames(l))a.add(e);l=Object.getPrototypeOf(l)}for(let l of[...a].sort())if(!l.startsWith("_"))try{let a=e(t[l],r,n+1);a&&"function"===a.$unsupported||(i[l]=a)}catch(e){i[l]={$error:String(e&&e.message?e.message:e)}}return r.delete(t),i})(e)),variableIds:[...new Set(t.flatMap(e=>e.variableIds))].sort(),styles:[r,n,i,a].flatMap((e,t)=>e.map(e=>({id:e.id,styleType:l[t]}))).sort((e,t)=>e.id.localeCompare(t.id)),localComplete:!0,usedRemoteComplete:!1}},variables:async function(e){let t=e.resources;function r(e,t=new WeakSet,n=0){if(null===e||["string","number","boolean"].includes(typeof e))return e;if(void 0===e)return{$undefined:!0};if("bigint"==typeof e)return{$bigint:e.toString()};if(["function","symbol"].includes(typeof e))return{$unsupported:typeof e};if(n>12)return{$truncated:"max-depth"};if("object"==typeof e&&"parent"in e&&"string"==typeof e.id&&"string"==typeof e.type)return{$nodeId:e.id,$nodeType:e.type};if(Array.isArray(e))return e.map(e=>r(e,t,n+1));if(ArrayBuffer.isView(e))return{$binary:e.constructor.name,byteLength:e.byteLength};if(e instanceof ArrayBuffer)return{$binary:"ArrayBuffer",byteLength:e.byteLength};if(t.has(e))return{$circular:!0};t.add(e);let i={},a=new Set(Object.keys(e)),l=e;for(;l&&l!==Object.prototype;){for(let e of Object.getOwnPropertyNames(l))a.add(e);l=Object.getPrototypeOf(l)}for(let l of[...a].sort())if(!(l.startsWith("_")||["parent","children","consumers"].includes(l)))try{let a=r(e[l],t,n+1);a&&"function"===a.$unsupported||(i[l]=a)}catch(e){i[l]={$error:String(e&&e.message?e.message:e)}}return t.delete(e),i}let[n,i]=await Promise.all([Promise.all(t.variableIds.map(e=>figma.variables.getVariableByIdAsync(e))),Promise.all(t.styles.map(e=>figma.getStyleByIdAsync(e.id)))]),a=new Map(t.styles.map(e=>[e.id,e])),l=await Promise.all(i.filter(Boolean).map(async e=>{let t=a.get(e.id),n=t.styleType;if(Number.isInteger(t.consumerStart)&&Number.isInteger(t.consumerEnd)){let i=await e.getStyleConsumersAsync();return{id:e.id,styleType:n,$consumerStart:t.consumerStart,$consumerEntries:i.slice(t.consumerStart,t.consumerEnd).map(e=>[e.node.id,e.node.type,r(e.fields)])}}let i=await e.getStyleConsumersAsync();return{...r(e),styleType:n,$consumerCount:i.length,value:r("PAINT"===n?e.paints:"EFFECT"===n?e.effects:"GRID"===n?e.layoutGrids:e)}}));return{variables:n.filter(Boolean).map(e=>r(e)),styles:l}}};async function i(e){let t=n[e.script];if(!t)return{kind:"devup-result",requestId:e.requestId,error:`DEVUP_BRIDGE_UNKNOWN_SCRIPT: ${e.script} (아는 스크립트: ${Object.keys(n).join(", ")})`};try{var r;let n=await t({nodeId:(r=e.params).nodeId??"",rootIds:r.rootIds??[],snapshot:r.snapshot??{},search:r.search??{},explore:r.explore??{},resources:r.resources??{variableIds:[],styles:[]},largeValue:r.largeValue??{},asset:r.asset??{},theme:r.theme??{offset:0}});return{kind:"devup-result",requestId:e.requestId,data:n}}catch(t){return{kind:"devup-result",requestId:e.requestId,error:t instanceof Error?t.message:String(t)}}}let a=[],l=!1;async function o(){if(!l){l=!0;try{for(;a.length>0;){let e=a.shift(),t=await i(e).catch(t=>({kind:"devup-result",requestId:e.requestId,error:t instanceof Error?t.message:String(t)}));figma.ui.postMessage(t)}}finally{l=!1}}}figma.showUI(__html__,{width:320,height:220}),figma.ui.onmessage=e=>{if("object"==typeof e&&null!==e){if("devup-ready"===e.kind){let e={kind:"devup-status",fileKey:figma.fileKey??null,fileName:figma.root.name,port:1993};figma.ui.postMessage(e);return}"devup-job"===e.kind&&(a.push(e),o())}}})(); \ No newline at end of file From 668a3cf2be3d0a3830c6b4595beae06ff2d6e6ff Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 14 Sep 2026 01:16:12 +0900 Subject: [PATCH 4/5] docs: define isolated fill contract and validate about export boundary --- docs/hero-export-contract-probe.py | 93 + docs/isolated-fill-export-contract.md | 166 ++ docs/isolated-fill-export-evidence.json | 2559 +++++++++++++++++++++++ 3 files changed, 2818 insertions(+) create mode 100644 docs/hero-export-contract-probe.py create mode 100644 docs/isolated-fill-export-contract.md create mode 100644 docs/isolated-fill-export-evidence.json diff --git a/docs/hero-export-contract-probe.py b/docs/hero-export-contract-probe.py new file mode 100644 index 0000000..c0e6b80 --- /dev/null +++ b/docs/hero-export-contract-probe.py @@ -0,0 +1,93 @@ +"""Inspect acquired about assets without altering the design or render inputs. + +Usage: python docs/hero-export-contract-probe.py harness/render OUTPUT.json +The result diagnoses whole-node exports; it does not certify isolated pixels. +""" + +import hashlib +import json +import sys +from pathlib import Path + +import numpy as np +from PIL import Image + + +def sha(path): + return hashlib.sha256(path.read_bytes()).hexdigest() + + +def changed(first, second): + a = np.asarray(first.convert("RGB"), dtype=np.int16) + b = np.asarray(second.convert("RGB"), dtype=np.int16) + return int(np.any(np.abs(a - b) > 24, axis=2).sum()) + + +root = Path(sys.argv[1]) +manifest = json.loads((root / "targets.json").read_text(encoding="utf-8")) +report = {"tolerance": 24, "hero": [], "crop": []} +for target in manifest["targets"]: + if not target["name"].startswith("about-"): + continue + paths = target["acquisition"]["files"] + snapshot_path = next(p for p in paths if p.endswith(".snapshot.json")) + snapshot = json.loads((root / snapshot_path).read_text(encoding="utf-8")) + nodes = snapshot["nodes"] + frame = nodes[target["frame"]]["fields"]["absoluteBoundingBox"] + reference_path = root / target["reference"] + reference = Image.open(reference_path).convert("RGBA") + report.setdefault("binarySha256", target["acquisition"]["binarySha256"]) + # Membership follows the requested frame's subtree, not all roots that a + # section-scoped snapshot may also carry. + pending = [target["frame"]] + visited = set() + while pending: + node_id = pending.pop() + if node_id in visited: + continue + visited.add(node_id) + fields = nodes[node_id]["fields"] + pending.extend(fields.get("childrenIds") or []) + fills = fields.get("fills") or [] + if not isinstance(fills, list): + continue + images = [(i, p) for i, p in enumerate(fills) + if p.get("type") == "IMAGE" and p.get("visible") is not False] + for index, paint in images: + asset_id = f"{node_id}:fills:{index}" + asset_paths = [p for p, value in manifest["assets"].items() + if value == asset_id and p in paths] + if not asset_paths: + continue + bounds = fields["absoluteBoundingBox"] + x, y = round(bounds["x"] - frame["x"]), round(bounds["y"] - frame["y"]) + width, height = round(bounds["width"]), round(bounds["height"]) + asset_path = root / asset_paths[0] + asset = Image.open(asset_path).convert("RGBA") + region = reference.crop((x, y, x + width, y + height)) + if asset.size != region.size: + continue + flattened = Image.new("RGBA", asset.size, "white") + flattened.alpha_composite(asset) + record = { + "screen": target["name"], "nodeId": node_id, + "assetId": asset_id, "assetPath": asset_paths[0], + "bounds": [x, y, width, height], "fills": fills, + "childIds": fields.get("childrenIds") or [], + "assetSha256": sha(asset_path), "referenceSha256": sha(reference_path), + "exportVsReferenceChangedPixels": changed(flattened, region), + } + actual_path = root / "out" / f"{target['name']}.actual.png" + if actual_path.exists(): + actual = Image.open(actual_path).convert("RGBA") + record["actualSha256"] = sha(actual_path) + record["actualVsReferenceChangedPixels"] = changed( + actual.crop((x, y, x + width, y + height)), region) + if record["childIds"] and any(p.get("type") == "SOLID" for p in fills): + report["hero"].append(record) + elif paint.get("scaleMode") == "CROP": + report["crop"].append(record) + +Path(sys.argv[2]).write_text(json.dumps(report, indent=2), encoding="utf-8") +print(json.dumps({"hero": [(r["nodeId"], r["exportVsReferenceChangedPixels"]) for r in report["hero"]], + "crop": [(r["nodeId"], r["exportVsReferenceChangedPixels"]) for r in report["crop"]]}, indent=2)) diff --git a/docs/isolated-fill-export-contract.md b/docs/isolated-fill-export-contract.md new file mode 100644 index 0000000..4393c00 --- /dev/null +++ b/docs/isolated-fill-export-contract.md @@ -0,0 +1,166 @@ +# Isolated image fills: contract and the remaining validation boundary + +Investigated on `937313e39448db7f7c05dbb0ab206432261b2203`. The independent +native-bridge delivery correction is described in +[bridge-asset-delivery.md](bridge-asset-delivery.md). It changes transport only; +it does **not** turn a whole-node PNG into an isolated image fill. + +## Required representation + +An isolated-fill asset must explicitly identify a **node-local rectangular +rendition of one IMAGE paint**, distinct from both original uploaded image +bytes and a rendered node. This is the appropriate contract for the existing +background-layer generator: + +1. Identify the node, original fill index and image hash, file/version, + representation revision, format and scale. Validate the selected paint + before exporting. A different paint/representation cannot reuse an old + whole-node cache entry merely because the image hash matches. + The delivered asset identity/URL or cache inventory must also distinguish + the revision: acquisition deliberately reuses existing paths already listed + in its asset inventory, so changing script bytes alone cannot replace them. +2. Export exactly the selected image's pixels over transparency in the node's + local width/height box. Include its crop/scale mode, transform, rotation, + image filters, paint visibility and paint opacity once. Exclude other + fills, strokes, effects, node opacity, corner clipping, child contents and + ancestor composition. Those remain the responsibility of live CSS/layout. +3. Apply CROP in the renderer once; the consumer displays the resulting box + without reapplying `imageTransform`. Do not substitute original bytes under + this representation. FILL/FIT also require the local box and transparent + margins to be retained. TILE requires an explicit decision about a rendered + box versus a repeatable tile; it must not silently inherit a raw-image rule. +4. Preserve original paint ordering and unique fill-index URLs. Opacity belongs + to the isolated paint; blending that depends on other layers belongs to the + composition. An unsupported blend/filter/shape must produce an honest + limitation, not a successful claim of isolated parity. +5. Produce the requested encoding, with actual MIME, byte length and SHA-256. + PNG transparency is necessary for a reusable isolated layer. JPEG cannot + silently flatten transparency onto a background not named by the contract. + Transport fragments must reconstruct the **same selected rendition** with + the same scale and identity; re-exporting the whole node is invalid. +6. Keep folded node assets on their existing node-render contract. Discovery + must carry this distinction through request resolution, collection, + continuation, manifest, source map and delivery. `fills/N` alone currently + identifies both folded image assets and live background layers. A new + derived mapping should describe a rendered single paint and explicitly + disclaim original source bytes and pixel-perfect browser composition. + +The alternative is an explicitly tagged **raw-image** contract. It needs the +original codec/MIME and intrinsic dimensions, plus a renderer for the paint +transform, filters, opacity and transparent crop bounds. In particular, raw +JPEG bytes are not a PNG at the requested node scale. Removing the established +CROP exception while leaving old node-export assets in the cache would repeat +the W18 regression. No raw-image substitution is shipped here. + +## Why current exports fail this contract + +`assets.js` reads the selected fill only to validate its image hash, then calls +`node.exportAsync(settings)`. Neither the fill index nor the selected paint is +passed to that renderer. Two different IMAGE-fill requests on the same node, +using the same format/scale, therefore invoke precisely the same renderer with +precisely the same settings. Their filenames and source claims differ; the +rendered content cannot be isolated by those differences. + +This is not fixed by `contentsOnly`: that option excludes overlapping outside +layers, not the node's children or its other fills. `useAbsoluteBounds` controls +bounds, not paint selection. The installed official `@figma/plugin-typings` +`ExportSettingsImage` exposes no fill-selector option. + +`large_value.js` compounds the boundary: `$export:png@scale` and `$export:svg` +identify only a node rendition. They do not carry the selected fill index or +image hash. Replacing only the initial export would let a large isolated asset +announce one hash and retrieve whole-node fragments with another, which the +assembler correctly rejects. + +## Collected crop and multi-paint cases + +All three hero nodes have the same source image hash +`09939a0d306a1dc967f5f04afa6756203ca92dec`, FILL mode, an identity transform, +image opacity 1, a later white SOLID paint at approximately 0.7 opacity, and a +live child subtree. Their dimensions differ, but the defective composition +condition does not depend on width. The PNG already includes the white paint +and live children; the generator adds both again. + +The mobile portraits are a different multi-paint case: their active CROP image +is fill **2**, above a SOLID plate at fill 1, with a hidden image at fill 0. +For `422:3551`, the active transform's vertical scale is +`0.8508567214012146`, with translation `0.036508746445178986`. The existing +300 by 400 export has already applied this crop. Selecting the first image by +type would pick the hidden, wrong image. Reapplying the active transform would +stretch the correct crop again. Both mistakes are ruled out as remedies. + +The reproducible probe [hero-export-contract-probe.py](hero-export-contract-probe.py) +walks each acquired frame, matches manifest asset IDs to its acquisition hash +inventory, and compares exported pixels at the collected bounds against the +freshly acquired reference. It never replaces text or rewrites render inputs. +Exact results and measurement identities are in +[isolated-fill-export-evidence.json](isolated-fill-export-evidence.json). + +| Screen | Own base, both runs | Changed pixels | Rendered height | +| --- | ---: | ---: | ---: | +| about 360 | 5.4317833026% | 141,574 | 7,240 | +| about 992 | 2.9337565805% | 163,529 | 5,620 | +| about 1920 | 1.7682713195% | 161,504 | 4,758 | + +The mobile design/capture height is exactly 7,240. The wider reference PNGs +are 5,619 and 4,757 pixels high; the harness captures those viewport sizes and +separately reports the unchanged, one-pixel-taller rendered elements. These +pre-existing values are not evidence of a new vertical correction. + +| Validation | Result | +| --- | --- | +| Existing node-box CROP assets versus reference | All 11 have **0** changed pixels at channel tolerance 24. | +| Existing hero exports versus the entire reference hero | All 3 have **0** changed pixels, including children and white overlay; this violates isolation. | +| Generated hero region versus reference | 9,217 / 13,058 / 12,922 changed pixels at 360 / 992 / 1920. | +| Two different selected image fills on one node | Both call the same `node.exportAsync` with identical settings; the current renderer cannot select either paint. | +| An isolated replacement against crop and multi-paint references | **Not validated**: no original or isolated bytes were obtained. | + +The mobile hero region accounts for 0.3536295273 percentage points of the +screen. That is a localization/oracle result, **not** a promised production +improvement: live text can still differ after correct background isolation. +After subtracting the deliberate Korean allowance, the measured mobile +residual is 5.4317833026 - approximately 0.21 = **5.2217833026pp**. + +The baseline executable is this worktree's own build of unchanged production +at `937313e`, SHA-256 +`21f41954f76d4fe1fbe867191156fc8cc574879885062f792bdd830a95af8cf8`. +Its `-dirty` build label records the new, untracked test/probe files written +while the initial build was running; no production source had changed. +Acquisition ran the unchanged harness in an isolated local copy with the +existing call bank and exported-asset cache. A first acquisition without the +complete export cache was invalid and was stopped; it is not a baseline. +The accepted acquisition binds its own generated modules, snapshots, themes, +references and asset hashes to the preserved base binary. No threshold value +was used as a before measurement, and no harness script was edited. + +## What must change before a pixel correction can land + +The source hash names the image but does not supply original bytes or intrinsic +dimensions in the collected snapshot. A flattened composite loses the image +behind opaque children. There is no invertible CSS correction that can recover +those pixels, so the zero-difference whole-node oracle is not a valid fix. + +The Figma connector's `download_assets` request for `422:3378` returned +`UNAUTHORIZED`: "This app connection requires reauthentication before other +actions on this app can succeed." No live source image or isolated rendition +was obtained through that route. Cached whole-node assets can confirm the +defect and existing crop behavior, but cannot certify replacement pixels. + +The read-only Plugin API path has `getImageByHash(hash).getBytesAsync()` for +original bytes and `exportAsync()` for node renditions; it has no selected-paint +node export. A temporary rectangle with one paint could provide a rendition, +but it creates/removes document nodes and must not be smuggled into scripts +advertised as read-only. A host-side rasterizer of raw bytes preserves that +boundary but must first establish the crop/filter/composition contract above. + +Before shipping: obtain authenticated raw/isolated pixels; introduce explicit +representation identity through initial and chunked export; validate all three +heroes and all eleven already-correct CROP portraits; verify two active IMAGE +paints, hidden earlier paints, semi-transparent image paint over a solid, +filters, transformed crop, FIT padding, and cleanup/failure behavior if a +temporary-node route is deliberately adopted. Repeat generator acquisition +and rendering with the new asset identity, and review any changed corpus +goldens. This investigation does not claim those replacement tests passed. + +Korean `keep-all` is untouched. Its accepted approximately 0.21 percentage-point +allowance is excluded from the mobile defect accounting. diff --git a/docs/isolated-fill-export-evidence.json b/docs/isolated-fill-export-evidence.json new file mode 100644 index 0000000..27d3627 --- /dev/null +++ b/docs/isolated-fill-export-evidence.json @@ -0,0 +1,2559 @@ +{ + "baseCommit": "937313e39448db7f7c05dbb0ab206432261b2203", + "scope": "about; isolated-fill contract is a quantified negative, bridge fix changes transport only", + "baselineBuildNote": "Production sources were unchanged; dirty label came from untracked new tests/probe while build ran.", + "baselineBinarySha256": "21f41954f76d4fe1fbe867191156fc8cc574879885062f792bdd830a95af8cf8", + "baselineRuns": [ + [ + { + "screen": "about-422-3376", + "environmentStatus": "valid", + "viewport": { + "width": 360, + "height": 7240 + }, + "rendered": { + "width": 360, + "height": 7240 + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 360, + 7240 + ], + "actualDimensions": [ + 360, + 7240 + ], + "changedPixels": 141574, + "totalPixels": 2606400, + "changedRatio": 0.05431783302639656, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 238, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W24-A-hero-export\\harness\\render\\out\\about-422-3376.diff.png" + }, + "binarySha256": "21f41954f76d4fe1fbe867191156fc8cc574879885062f792bdd830a95af8cf8", + "themeHash": "67d6de70e67967432dcafb51a491b2105f11f5f5024cb4f79e1c8aa29b3503b7", + "acquisitionFiles": { + "src/screens/about-422-3376.tsx": "72d92ac544a77e758fb6547b2085b984d82728cb814bcc2a0a25a7bc2b73827c", + "themes/about-422-3376.json": "67d6de70e67967432dcafb51a491b2105f11f5f5024cb4f79e1c8aa29b3503b7", + "out/about-422-3376.reference.png": "183b29572ab786dbe588e0bfed57db8210920e4f070dfb22226065a6545c17f8", + "out/about-422-3376-422-3376.snapshot.json": "6e68ee5121616f01497345619f8185f6c37fdab363d9132c388738fdd599ebdd", + "public/images/Section1-422-2989.png": "40b072777cb9dde85763e63e029239cb1d7e14409f8b316d7283697abcc53868", + "public/images/2-1-422-2991-04c06818b22f.png": "e6015ba1c9fb9303d471cf0eb7405afa8e255825684f506b7a0a53ff93fe9c8e", + "public/images/Frame-269-422-2996-e302b6b111d4.png": "6a0ae8afa45e6b73a2620d0545a7fed0445ff52515377d8b85db4889db2906ce", + "public/icons/file-analytic_14427169-1-422-3010-c18bf91459ac.svg": "9d7d47743459dc88c3f484fdbb53a5bb73fb1be608ba3a6852fcda731f144614", + "public/icons/shopping-list_1288709-1-422-3028-21f19fe34057.svg": "e94970ba54e1861da6777e7f8c1094161e9958c3cd7b43fb3ea73cd771cc6a12", + "public/icons/meeting_1621655-1-422-3059-fbf10cffffdc.svg": "3380c956ec0a7935618109ea320b56b56c8821f0e3d34023fa8a982998df1133", + "public/icons/422-3095-55250514fb17.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3097-0d37556a31a6.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/icons/puzzle_17833563-1-422-3100-68fcd7ce5191.svg": "f853f0aa03903d26ff4ac0658f81eaa357b78b9881b2e8d2c47ac345e879e38e", + "public/images/Frame-1000014115-422-3106-47c4161cbfdc.png": "dd6cb90a65d7ed388b93a7e3ce60b6c4138c54d23a5e24867ce02720b56202a1", + "public/images/Frame-256-422-3125-2-176f1c6fe3ab.png": "d966f8f5ee2c191a163fdb4a6b43c0f579b7f1811961fbda7362f927217d4ad5", + "public/icons/Frame-287-422-3133-3ccb13ba51fd.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3137-5e3d7d6e17fd.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3141-107eb1e2beea.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-257-422-3145-2-357f7710ea85.png": "5cf8ab0f1b8cd7b6c70ef03b2d3e15b2c7f67a9e3cb6013d1915c92c6e0cab88", + "public/icons/Frame-287-422-3150-12eb2516b4d2.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3154-a2eb9f1af7d7.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3158-4f13a54de65b.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-258-422-3162-2-e27c69996ca2.png": "f746a34333dfd09fc0507092b27c5300a0c76ec9d44e0ec87d712a410f8ef33b", + "public/icons/Frame-287-422-3167-54ec1d92f274.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-259-422-3171-2-a35dcd9fae03.png": "f6d9ffdbac3cc6d48554c6278019cb6a6184cb10d4670a3b7342808beec3d937", + "public/icons/Frame-287-422-3176-97916df902d3.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Section1-422-3183.png": "7720dc3e1f4c9659ffe9fe55604e4bdac5db1e04a7dad88d70890e3c9e7a9fe8", + "public/images/2-1-422-3185-c2c2bb9fd4ca.png": "1c38f71561ca2fd4aefa625958d9101e178e1540887049db544c37884f22dc79", + "public/images/Frame-269-422-3190-fd04b8b6b1f3.png": "47be398c71c507eede8a2545697ea8db2fe60a9cd2dbfe4d4ef777e7852454b3", + "public/icons/file-analytic_14427169-1-422-3204-432c13ca99bd.svg": "9d7d47743459dc88c3f484fdbb53a5bb73fb1be608ba3a6852fcda731f144614", + "public/icons/shopping-list_1288709-1-422-3222-b3e9e8487485.svg": "c7a372e75e151f942986fbe8a32a4b1a002ed0f105462a2284b3304d50af77ba", + "public/icons/meeting_1621655-1-422-3253-298cce04954e.svg": "39c1f190f5337a2ef2131d345ecb1cc385d7360861d517111901def4511fe106", + "public/icons/422-3289-1341670f1470.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3291-f455a67c7691.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/icons/puzzle_17833563-1-422-3294-2f23118b8931.svg": "b30a7b5201b6438bbe3fa0eede1f571bc14f7ca53cbb3e7cd6f073a1c7dea28a", + "public/images/Frame-1000014115-422-3300-897dd4548a76.png": "0f14e1f6ba38c889b2a79213a07671cbc7ff77bc64bf0b684ab5d828b0e47ff0", + "public/images/Frame-256-422-3320-2-2f4ae32bf58f.png": "d966f8f5ee2c191a163fdb4a6b43c0f579b7f1811961fbda7362f927217d4ad5", + "public/icons/Frame-287-422-3328-3a4711366ec2.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3332-afb9a56cd5bf.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3336-2f9cf19d6dce.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-257-422-3340-2-a9b56c699b23.png": "5cf8ab0f1b8cd7b6c70ef03b2d3e15b2c7f67a9e3cb6013d1915c92c6e0cab88", + "public/icons/Frame-287-422-3345-d5b693523dde.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3349-0d8a14703259.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3353-eaa50e1d86e7.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-258-422-3358-2-0adcc70fa0d7.png": "f746a34333dfd09fc0507092b27c5300a0c76ec9d44e0ec87d712a410f8ef33b", + "public/icons/Frame-287-422-3363-2b09fc7a41f0.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-259-422-3367-2-4d462c68adbb.png": "f6d9ffdbac3cc6d48554c6278019cb6a6184cb10d4670a3b7342808beec3d937", + "public/icons/Frame-287-422-3372-240bfbcd93a8.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Section1-422-3378.png": "ba4cd45f211bb5e4e73d4bf75981f6f2aed04575e1b82fbb4afbb09c80a92c1c", + "public/images/2-1-422-3380-cb2a0042a641.png": "a6604f6a23668a36fe7669bb7dae27e1303241e319ec3c5fc004cef912a4df27", + "public/images/Frame-269-422-3392-5be2d3573dd4.png": "856609c2b24d369580edb5cb87430ad33ea8fbc3f5a559fe8e9969c70b781931", + "public/icons/file-analytic_14427169-1-422-3399-139dd88e7135.svg": "0071bed431ba0fd316d73e20f975881603c259cbcd21ed7c1c6c327cd5a115b9", + "public/icons/shopping-list_1288709-1-422-3417-791e321745e1.svg": "03466401cfb2bdba43054fab1e191393bcf405cb23987e40ff32f20ebd264ab8", + "public/icons/meeting_1621655-1-422-3448-05d5b482e0b5.svg": "cbe97ff3f21e401fdea44bd56b50deb907688d9fe70a6ac359c43f72c8b0cb72", + "public/icons/puzzle_17833563-1-422-3481-a67ca4e245af.svg": "9e48c170db858584703aa6a6ad8ef1d87497787be9d78ae7e0b97ac707436b7d", + "public/icons/422-3486-2489fb200011.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3488-1c4e20055c2e.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/images/Frame-1000014115-422-3495-753f13b2e0dd.png": "8dbde872e57446334285215e31b7ce62888ecc6f734ef80d0b0cbf043fa71ab8", + "public/images/Frame-256-422-3514-2-ef1ce40418b8.png": "85a1ac763f2ba75cf4439afe43c79e93d3b9223698e5ddd6f27f7abfc44f5ff6", + "public/icons/Frame-287-422-3522-69bff93d7324.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3526-6b5842e92a01.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3530-14f6769de568.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-257-422-3534-2-48ea6bc9848a.png": "1ea58b9e09a248bcfa987612c7c9525cd5ac91c162d284c4ecfb163c135e3e7b", + "public/icons/Frame-287-422-3539-b40757ac8c31.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3543-518a0dce63b4.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3547-71792e0420f0.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-258-422-3551-2-212ce23b8c62.png": "bb6358a55187f71806b213afa22a8a631290f7643caa60099d70316682a4e42b", + "public/icons/Frame-287-422-3556-ef8452af3a3e.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-259-422-3560-2-502893d58465.png": "fbe4631ff8bd6375993763bb6c0e8cbd5c4cfe8bd27ec9e3765a2add021d43b9", + "public/icons/Frame-287-422-3565-d40d8a2c65bb.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-1000014286-I422-2988-935-102168-8297aaad000c.svg": "ffb8c9aa5bf5391a72f128243a4a31a4a1bb51f916ef9016c8c5ee65856e3972", + "public/icons/Container-I422-3179-1127-78173.svg": "8f3c2a9c29107bb5dce6c10f48884e532c086bf8cc85eed8e5495edc5dcdca0c", + "public/icons/Icons-location-60eb5ab59e5e.svg": "d3941032c41126ef38a5c1e529a4300029c2514f827b84319c54f87def94b031", + "public/icons/Icons-tel-b5d1fc7747cd.svg": "89a41a35802eb8d04d6716354e1d7058105fc13b8743210a0a7a4fbb18882493", + "public/icons/Icons-email-c8a6dae31bb4.svg": "1dcb7f565b0412e496f625d248ce973abc44b545b9ed7015644deaf0d6fac8ca", + "public/icons/Icons-insta-8f3f8e048fd3.svg": "5ccbd4b5ddacef31234d53d90993935ea6e65f138f31c607ee77b1c0c17954ed", + "public/icons/Icons-mention-a09d585d05ef.svg": "6a55243c947343a2d9d67a42382017a1fdf91ec52756833bdb8b9c583bb6eb53", + "public/icons/Icons-docs-7356013800c3.svg": "acad8716a68f6071b024beccd78080560cff32b1c3ee1a84082d75a360b7ec5e", + "public/icons/Frame-1000014286-I422-3182-935-102168-a94614c9360a.svg": "ffb8c9aa5bf5391a72f128243a4a31a4a1bb51f916ef9016c8c5ee65856e3972", + "public/icons/Container-I422-3375-1127-78173.svg": "8f3c2a9c29107bb5dce6c10f48884e532c086bf8cc85eed8e5495edc5dcdca0c", + "public/icons/Icons-hamburger-cf989eed2cd8.svg": "ac9e2bfeabbaa0102254d8f53bc597888c73af1e226ae0c4bc381ce90f1132d3", + "public/icons/Frame-1000014285-I422-3377-935-101749-cfb195196c6c.svg": "8a0565afa4709169455563a507331af0f1994406746f2f27b3c56f60dc265c77", + "public/icons/P-I422-3568-277-7767.svg": "682a7fb16df448d4c9435bcaf6306e79761e737490e852190478246303414c37", + "public/icons/Icons-arrow-abf22ae153b4.svg": "830d5a696d483574fe3c11135427ff47c9cb86f85984de47b694e64deef7c05c" + } + }, + { + "screen": "about-422-3180", + "environmentStatus": "valid", + "viewport": { + "width": 992, + "height": 5619 + }, + "rendered": { + "width": 992, + "height": 5620 + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 992, + 5619 + ], + "actualDimensions": [ + 992, + 5619 + ], + "changedPixels": 163529, + "totalPixels": 5574048, + "changedRatio": 0.02933756580495898, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 238, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W24-A-hero-export\\harness\\render\\out\\about-422-3180.diff.png" + }, + "binarySha256": "21f41954f76d4fe1fbe867191156fc8cc574879885062f792bdd830a95af8cf8", + "themeHash": "67d6de70e67967432dcafb51a491b2105f11f5f5024cb4f79e1c8aa29b3503b7", + "acquisitionFiles": { + "src/screens/about-422-3180.tsx": "c9f36e5ee08596368962f0872314b74fd7d83ce2f9e32c230400b3e1477ccb92", + "themes/about-422-3180.json": "67d6de70e67967432dcafb51a491b2105f11f5f5024cb4f79e1c8aa29b3503b7", + "out/about-422-3180.reference.png": "9487389f99ba9d199262ddf0c0e8acaed0679b0aadceeb535cecb99f6b3e1faa", + "out/about-422-3180-422-3180.snapshot.json": "6e68ee5121616f01497345619f8185f6c37fdab363d9132c388738fdd599ebdd", + "public/images/Section1-422-2989.png": "40b072777cb9dde85763e63e029239cb1d7e14409f8b316d7283697abcc53868", + "public/images/2-1-422-2991-04c06818b22f.png": "e6015ba1c9fb9303d471cf0eb7405afa8e255825684f506b7a0a53ff93fe9c8e", + "public/images/Frame-269-422-2996-e302b6b111d4.png": "6a0ae8afa45e6b73a2620d0545a7fed0445ff52515377d8b85db4889db2906ce", + "public/icons/file-analytic_14427169-1-422-3010-c18bf91459ac.svg": "9d7d47743459dc88c3f484fdbb53a5bb73fb1be608ba3a6852fcda731f144614", + "public/icons/shopping-list_1288709-1-422-3028-21f19fe34057.svg": "e94970ba54e1861da6777e7f8c1094161e9958c3cd7b43fb3ea73cd771cc6a12", + "public/icons/meeting_1621655-1-422-3059-fbf10cffffdc.svg": "3380c956ec0a7935618109ea320b56b56c8821f0e3d34023fa8a982998df1133", + "public/icons/422-3095-55250514fb17.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3097-0d37556a31a6.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/icons/puzzle_17833563-1-422-3100-68fcd7ce5191.svg": "f853f0aa03903d26ff4ac0658f81eaa357b78b9881b2e8d2c47ac345e879e38e", + "public/images/Frame-1000014115-422-3106-47c4161cbfdc.png": "dd6cb90a65d7ed388b93a7e3ce60b6c4138c54d23a5e24867ce02720b56202a1", + "public/images/Frame-256-422-3125-2-176f1c6fe3ab.png": "d966f8f5ee2c191a163fdb4a6b43c0f579b7f1811961fbda7362f927217d4ad5", + "public/icons/Frame-287-422-3133-3ccb13ba51fd.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3137-5e3d7d6e17fd.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3141-107eb1e2beea.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-257-422-3145-2-357f7710ea85.png": "5cf8ab0f1b8cd7b6c70ef03b2d3e15b2c7f67a9e3cb6013d1915c92c6e0cab88", + "public/icons/Frame-287-422-3150-12eb2516b4d2.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3154-a2eb9f1af7d7.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3158-4f13a54de65b.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-258-422-3162-2-e27c69996ca2.png": "f746a34333dfd09fc0507092b27c5300a0c76ec9d44e0ec87d712a410f8ef33b", + "public/icons/Frame-287-422-3167-54ec1d92f274.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-259-422-3171-2-a35dcd9fae03.png": "f6d9ffdbac3cc6d48554c6278019cb6a6184cb10d4670a3b7342808beec3d937", + "public/icons/Frame-287-422-3176-97916df902d3.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Section1-422-3183.png": "7720dc3e1f4c9659ffe9fe55604e4bdac5db1e04a7dad88d70890e3c9e7a9fe8", + "public/images/2-1-422-3185-c2c2bb9fd4ca.png": "1c38f71561ca2fd4aefa625958d9101e178e1540887049db544c37884f22dc79", + "public/images/Frame-269-422-3190-fd04b8b6b1f3.png": "47be398c71c507eede8a2545697ea8db2fe60a9cd2dbfe4d4ef777e7852454b3", + "public/icons/file-analytic_14427169-1-422-3204-432c13ca99bd.svg": "9d7d47743459dc88c3f484fdbb53a5bb73fb1be608ba3a6852fcda731f144614", + "public/icons/shopping-list_1288709-1-422-3222-b3e9e8487485.svg": "c7a372e75e151f942986fbe8a32a4b1a002ed0f105462a2284b3304d50af77ba", + "public/icons/meeting_1621655-1-422-3253-298cce04954e.svg": "39c1f190f5337a2ef2131d345ecb1cc385d7360861d517111901def4511fe106", + "public/icons/422-3289-1341670f1470.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3291-f455a67c7691.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/icons/puzzle_17833563-1-422-3294-2f23118b8931.svg": "b30a7b5201b6438bbe3fa0eede1f571bc14f7ca53cbb3e7cd6f073a1c7dea28a", + "public/images/Frame-1000014115-422-3300-897dd4548a76.png": "0f14e1f6ba38c889b2a79213a07671cbc7ff77bc64bf0b684ab5d828b0e47ff0", + "public/images/Frame-256-422-3320-2-2f4ae32bf58f.png": "d966f8f5ee2c191a163fdb4a6b43c0f579b7f1811961fbda7362f927217d4ad5", + "public/icons/Frame-287-422-3328-3a4711366ec2.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3332-afb9a56cd5bf.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3336-2f9cf19d6dce.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-257-422-3340-2-a9b56c699b23.png": "5cf8ab0f1b8cd7b6c70ef03b2d3e15b2c7f67a9e3cb6013d1915c92c6e0cab88", + "public/icons/Frame-287-422-3345-d5b693523dde.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3349-0d8a14703259.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3353-eaa50e1d86e7.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-258-422-3358-2-0adcc70fa0d7.png": "f746a34333dfd09fc0507092b27c5300a0c76ec9d44e0ec87d712a410f8ef33b", + "public/icons/Frame-287-422-3363-2b09fc7a41f0.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-259-422-3367-2-4d462c68adbb.png": "f6d9ffdbac3cc6d48554c6278019cb6a6184cb10d4670a3b7342808beec3d937", + "public/icons/Frame-287-422-3372-240bfbcd93a8.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Section1-422-3378.png": "ba4cd45f211bb5e4e73d4bf75981f6f2aed04575e1b82fbb4afbb09c80a92c1c", + "public/images/2-1-422-3380-cb2a0042a641.png": "a6604f6a23668a36fe7669bb7dae27e1303241e319ec3c5fc004cef912a4df27", + "public/images/Frame-269-422-3392-5be2d3573dd4.png": "856609c2b24d369580edb5cb87430ad33ea8fbc3f5a559fe8e9969c70b781931", + "public/icons/file-analytic_14427169-1-422-3399-139dd88e7135.svg": "0071bed431ba0fd316d73e20f975881603c259cbcd21ed7c1c6c327cd5a115b9", + "public/icons/shopping-list_1288709-1-422-3417-791e321745e1.svg": "03466401cfb2bdba43054fab1e191393bcf405cb23987e40ff32f20ebd264ab8", + "public/icons/meeting_1621655-1-422-3448-05d5b482e0b5.svg": "cbe97ff3f21e401fdea44bd56b50deb907688d9fe70a6ac359c43f72c8b0cb72", + "public/icons/puzzle_17833563-1-422-3481-a67ca4e245af.svg": "9e48c170db858584703aa6a6ad8ef1d87497787be9d78ae7e0b97ac707436b7d", + "public/icons/422-3486-2489fb200011.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3488-1c4e20055c2e.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/images/Frame-1000014115-422-3495-753f13b2e0dd.png": "8dbde872e57446334285215e31b7ce62888ecc6f734ef80d0b0cbf043fa71ab8", + "public/images/Frame-256-422-3514-2-ef1ce40418b8.png": "85a1ac763f2ba75cf4439afe43c79e93d3b9223698e5ddd6f27f7abfc44f5ff6", + "public/icons/Frame-287-422-3522-69bff93d7324.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3526-6b5842e92a01.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3530-14f6769de568.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-257-422-3534-2-48ea6bc9848a.png": "1ea58b9e09a248bcfa987612c7c9525cd5ac91c162d284c4ecfb163c135e3e7b", + "public/icons/Frame-287-422-3539-b40757ac8c31.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3543-518a0dce63b4.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3547-71792e0420f0.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-258-422-3551-2-212ce23b8c62.png": "bb6358a55187f71806b213afa22a8a631290f7643caa60099d70316682a4e42b", + "public/icons/Frame-287-422-3556-ef8452af3a3e.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-259-422-3560-2-502893d58465.png": "fbe4631ff8bd6375993763bb6c0e8cbd5c4cfe8bd27ec9e3765a2add021d43b9", + "public/icons/Frame-287-422-3565-d40d8a2c65bb.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-1000014286-I422-2988-935-102168-8297aaad000c.svg": "ffb8c9aa5bf5391a72f128243a4a31a4a1bb51f916ef9016c8c5ee65856e3972", + "public/icons/Container-I422-3179-1127-78173.svg": "8f3c2a9c29107bb5dce6c10f48884e532c086bf8cc85eed8e5495edc5dcdca0c", + "public/icons/Icons-location-60eb5ab59e5e.svg": "d3941032c41126ef38a5c1e529a4300029c2514f827b84319c54f87def94b031", + "public/icons/Icons-tel-b5d1fc7747cd.svg": "89a41a35802eb8d04d6716354e1d7058105fc13b8743210a0a7a4fbb18882493", + "public/icons/Icons-email-c8a6dae31bb4.svg": "1dcb7f565b0412e496f625d248ce973abc44b545b9ed7015644deaf0d6fac8ca", + "public/icons/Icons-insta-8f3f8e048fd3.svg": "5ccbd4b5ddacef31234d53d90993935ea6e65f138f31c607ee77b1c0c17954ed", + "public/icons/Icons-mention-a09d585d05ef.svg": "6a55243c947343a2d9d67a42382017a1fdf91ec52756833bdb8b9c583bb6eb53", + "public/icons/Icons-docs-7356013800c3.svg": "acad8716a68f6071b024beccd78080560cff32b1c3ee1a84082d75a360b7ec5e", + "public/icons/Frame-1000014286-I422-3182-935-102168-a94614c9360a.svg": "ffb8c9aa5bf5391a72f128243a4a31a4a1bb51f916ef9016c8c5ee65856e3972", + "public/icons/Container-I422-3375-1127-78173.svg": "8f3c2a9c29107bb5dce6c10f48884e532c086bf8cc85eed8e5495edc5dcdca0c", + "public/icons/Icons-hamburger-cf989eed2cd8.svg": "ac9e2bfeabbaa0102254d8f53bc597888c73af1e226ae0c4bc381ce90f1132d3", + "public/icons/Frame-1000014285-I422-3377-935-101749-cfb195196c6c.svg": "8a0565afa4709169455563a507331af0f1994406746f2f27b3c56f60dc265c77", + "public/icons/P-I422-3568-277-7767.svg": "682a7fb16df448d4c9435bcaf6306e79761e737490e852190478246303414c37", + "public/icons/Icons-arrow-abf22ae153b4.svg": "830d5a696d483574fe3c11135427ff47c9cb86f85984de47b694e64deef7c05c" + } + }, + { + "screen": "about-422-2987", + "environmentStatus": "valid", + "viewport": { + "width": 1920, + "height": 4757 + }, + "rendered": { + "width": 1920, + "height": 4758 + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 1920, + 4757 + ], + "actualDimensions": [ + 1920, + 4757 + ], + "changedPixels": 161504, + "totalPixels": 9133440, + "changedRatio": 0.01768271319459043, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 238, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W24-A-hero-export\\harness\\render\\out\\about-422-2987.diff.png" + }, + "binarySha256": "21f41954f76d4fe1fbe867191156fc8cc574879885062f792bdd830a95af8cf8", + "themeHash": "67d6de70e67967432dcafb51a491b2105f11f5f5024cb4f79e1c8aa29b3503b7", + "acquisitionFiles": { + "src/screens/about-422-2987.tsx": "e0c1ba3c07a85b4a785906a74383ec9c35480a7e95a8d81ecd3df2506fd5f7e6", + "themes/about-422-2987.json": "67d6de70e67967432dcafb51a491b2105f11f5f5024cb4f79e1c8aa29b3503b7", + "out/about-422-2987.reference.png": "6dc173242afb2bc5ad5d7262d4d23acd1ec7fcc468db32c413cc5356b3dd9120", + "out/about-422-2987-422-2987.snapshot.json": "6e68ee5121616f01497345619f8185f6c37fdab363d9132c388738fdd599ebdd", + "public/images/Section1-422-2989.png": "40b072777cb9dde85763e63e029239cb1d7e14409f8b316d7283697abcc53868", + "public/images/2-1-422-2991-04c06818b22f.png": "e6015ba1c9fb9303d471cf0eb7405afa8e255825684f506b7a0a53ff93fe9c8e", + "public/images/Frame-269-422-2996-e302b6b111d4.png": "6a0ae8afa45e6b73a2620d0545a7fed0445ff52515377d8b85db4889db2906ce", + "public/icons/file-analytic_14427169-1-422-3010-c18bf91459ac.svg": "9d7d47743459dc88c3f484fdbb53a5bb73fb1be608ba3a6852fcda731f144614", + "public/icons/shopping-list_1288709-1-422-3028-21f19fe34057.svg": "e94970ba54e1861da6777e7f8c1094161e9958c3cd7b43fb3ea73cd771cc6a12", + "public/icons/meeting_1621655-1-422-3059-fbf10cffffdc.svg": "3380c956ec0a7935618109ea320b56b56c8821f0e3d34023fa8a982998df1133", + "public/icons/422-3095-55250514fb17.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3097-0d37556a31a6.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/icons/puzzle_17833563-1-422-3100-68fcd7ce5191.svg": "f853f0aa03903d26ff4ac0658f81eaa357b78b9881b2e8d2c47ac345e879e38e", + "public/images/Frame-1000014115-422-3106-47c4161cbfdc.png": "dd6cb90a65d7ed388b93a7e3ce60b6c4138c54d23a5e24867ce02720b56202a1", + "public/images/Frame-256-422-3125-2-176f1c6fe3ab.png": "d966f8f5ee2c191a163fdb4a6b43c0f579b7f1811961fbda7362f927217d4ad5", + "public/icons/Frame-287-422-3133-3ccb13ba51fd.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3137-5e3d7d6e17fd.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3141-107eb1e2beea.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-257-422-3145-2-357f7710ea85.png": "5cf8ab0f1b8cd7b6c70ef03b2d3e15b2c7f67a9e3cb6013d1915c92c6e0cab88", + "public/icons/Frame-287-422-3150-12eb2516b4d2.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3154-a2eb9f1af7d7.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3158-4f13a54de65b.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-258-422-3162-2-e27c69996ca2.png": "f746a34333dfd09fc0507092b27c5300a0c76ec9d44e0ec87d712a410f8ef33b", + "public/icons/Frame-287-422-3167-54ec1d92f274.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-259-422-3171-2-a35dcd9fae03.png": "f6d9ffdbac3cc6d48554c6278019cb6a6184cb10d4670a3b7342808beec3d937", + "public/icons/Frame-287-422-3176-97916df902d3.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Section1-422-3183.png": "7720dc3e1f4c9659ffe9fe55604e4bdac5db1e04a7dad88d70890e3c9e7a9fe8", + "public/images/2-1-422-3185-c2c2bb9fd4ca.png": "1c38f71561ca2fd4aefa625958d9101e178e1540887049db544c37884f22dc79", + "public/images/Frame-269-422-3190-fd04b8b6b1f3.png": "47be398c71c507eede8a2545697ea8db2fe60a9cd2dbfe4d4ef777e7852454b3", + "public/icons/file-analytic_14427169-1-422-3204-432c13ca99bd.svg": "9d7d47743459dc88c3f484fdbb53a5bb73fb1be608ba3a6852fcda731f144614", + "public/icons/shopping-list_1288709-1-422-3222-b3e9e8487485.svg": "c7a372e75e151f942986fbe8a32a4b1a002ed0f105462a2284b3304d50af77ba", + "public/icons/meeting_1621655-1-422-3253-298cce04954e.svg": "39c1f190f5337a2ef2131d345ecb1cc385d7360861d517111901def4511fe106", + "public/icons/422-3289-1341670f1470.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3291-f455a67c7691.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/icons/puzzle_17833563-1-422-3294-2f23118b8931.svg": "b30a7b5201b6438bbe3fa0eede1f571bc14f7ca53cbb3e7cd6f073a1c7dea28a", + "public/images/Frame-1000014115-422-3300-897dd4548a76.png": "0f14e1f6ba38c889b2a79213a07671cbc7ff77bc64bf0b684ab5d828b0e47ff0", + "public/images/Frame-256-422-3320-2-2f4ae32bf58f.png": "d966f8f5ee2c191a163fdb4a6b43c0f579b7f1811961fbda7362f927217d4ad5", + "public/icons/Frame-287-422-3328-3a4711366ec2.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3332-afb9a56cd5bf.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3336-2f9cf19d6dce.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-257-422-3340-2-a9b56c699b23.png": "5cf8ab0f1b8cd7b6c70ef03b2d3e15b2c7f67a9e3cb6013d1915c92c6e0cab88", + "public/icons/Frame-287-422-3345-d5b693523dde.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3349-0d8a14703259.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3353-eaa50e1d86e7.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-258-422-3358-2-0adcc70fa0d7.png": "f746a34333dfd09fc0507092b27c5300a0c76ec9d44e0ec87d712a410f8ef33b", + "public/icons/Frame-287-422-3363-2b09fc7a41f0.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-259-422-3367-2-4d462c68adbb.png": "f6d9ffdbac3cc6d48554c6278019cb6a6184cb10d4670a3b7342808beec3d937", + "public/icons/Frame-287-422-3372-240bfbcd93a8.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Section1-422-3378.png": "ba4cd45f211bb5e4e73d4bf75981f6f2aed04575e1b82fbb4afbb09c80a92c1c", + "public/images/2-1-422-3380-cb2a0042a641.png": "a6604f6a23668a36fe7669bb7dae27e1303241e319ec3c5fc004cef912a4df27", + "public/images/Frame-269-422-3392-5be2d3573dd4.png": "856609c2b24d369580edb5cb87430ad33ea8fbc3f5a559fe8e9969c70b781931", + "public/icons/file-analytic_14427169-1-422-3399-139dd88e7135.svg": "0071bed431ba0fd316d73e20f975881603c259cbcd21ed7c1c6c327cd5a115b9", + "public/icons/shopping-list_1288709-1-422-3417-791e321745e1.svg": "03466401cfb2bdba43054fab1e191393bcf405cb23987e40ff32f20ebd264ab8", + "public/icons/meeting_1621655-1-422-3448-05d5b482e0b5.svg": "cbe97ff3f21e401fdea44bd56b50deb907688d9fe70a6ac359c43f72c8b0cb72", + "public/icons/puzzle_17833563-1-422-3481-a67ca4e245af.svg": "9e48c170db858584703aa6a6ad8ef1d87497787be9d78ae7e0b97ac707436b7d", + "public/icons/422-3486-2489fb200011.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3488-1c4e20055c2e.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/images/Frame-1000014115-422-3495-753f13b2e0dd.png": "8dbde872e57446334285215e31b7ce62888ecc6f734ef80d0b0cbf043fa71ab8", + "public/images/Frame-256-422-3514-2-ef1ce40418b8.png": "85a1ac763f2ba75cf4439afe43c79e93d3b9223698e5ddd6f27f7abfc44f5ff6", + "public/icons/Frame-287-422-3522-69bff93d7324.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3526-6b5842e92a01.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3530-14f6769de568.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-257-422-3534-2-48ea6bc9848a.png": "1ea58b9e09a248bcfa987612c7c9525cd5ac91c162d284c4ecfb163c135e3e7b", + "public/icons/Frame-287-422-3539-b40757ac8c31.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3543-518a0dce63b4.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3547-71792e0420f0.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-258-422-3551-2-212ce23b8c62.png": "bb6358a55187f71806b213afa22a8a631290f7643caa60099d70316682a4e42b", + "public/icons/Frame-287-422-3556-ef8452af3a3e.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-259-422-3560-2-502893d58465.png": "fbe4631ff8bd6375993763bb6c0e8cbd5c4cfe8bd27ec9e3765a2add021d43b9", + "public/icons/Frame-287-422-3565-d40d8a2c65bb.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-1000014286-I422-2988-935-102168-8297aaad000c.svg": "ffb8c9aa5bf5391a72f128243a4a31a4a1bb51f916ef9016c8c5ee65856e3972", + "public/icons/Container-I422-3179-1127-78173.svg": "8f3c2a9c29107bb5dce6c10f48884e532c086bf8cc85eed8e5495edc5dcdca0c", + "public/icons/Icons-location-60eb5ab59e5e.svg": "d3941032c41126ef38a5c1e529a4300029c2514f827b84319c54f87def94b031", + "public/icons/Icons-tel-b5d1fc7747cd.svg": "89a41a35802eb8d04d6716354e1d7058105fc13b8743210a0a7a4fbb18882493", + "public/icons/Icons-email-c8a6dae31bb4.svg": "1dcb7f565b0412e496f625d248ce973abc44b545b9ed7015644deaf0d6fac8ca", + "public/icons/Icons-insta-8f3f8e048fd3.svg": "5ccbd4b5ddacef31234d53d90993935ea6e65f138f31c607ee77b1c0c17954ed", + "public/icons/Icons-mention-a09d585d05ef.svg": "6a55243c947343a2d9d67a42382017a1fdf91ec52756833bdb8b9c583bb6eb53", + "public/icons/Icons-docs-7356013800c3.svg": "acad8716a68f6071b024beccd78080560cff32b1c3ee1a84082d75a360b7ec5e", + "public/icons/Frame-1000014286-I422-3182-935-102168-a94614c9360a.svg": "ffb8c9aa5bf5391a72f128243a4a31a4a1bb51f916ef9016c8c5ee65856e3972", + "public/icons/Container-I422-3375-1127-78173.svg": "8f3c2a9c29107bb5dce6c10f48884e532c086bf8cc85eed8e5495edc5dcdca0c", + "public/icons/Icons-hamburger-cf989eed2cd8.svg": "ac9e2bfeabbaa0102254d8f53bc597888c73af1e226ae0c4bc381ce90f1132d3", + "public/icons/Frame-1000014285-I422-3377-935-101749-cfb195196c6c.svg": "8a0565afa4709169455563a507331af0f1994406746f2f27b3c56f60dc265c77", + "public/icons/P-I422-3568-277-7767.svg": "682a7fb16df448d4c9435bcaf6306e79761e737490e852190478246303414c37", + "public/icons/Icons-arrow-abf22ae153b4.svg": "830d5a696d483574fe3c11135427ff47c9cb86f85984de47b694e64deef7c05c" + } + } + ], + [ + { + "screen": "about-422-3376", + "environmentStatus": "valid", + "viewport": { + "width": 360, + "height": 7240 + }, + "rendered": { + "width": 360, + "height": 7240 + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 360, + 7240 + ], + "actualDimensions": [ + 360, + 7240 + ], + "changedPixels": 141574, + "totalPixels": 2606400, + "changedRatio": 0.05431783302639656, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 238, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W24-A-hero-export\\harness\\render\\out\\about-422-3376.diff.png" + }, + "binarySha256": "21f41954f76d4fe1fbe867191156fc8cc574879885062f792bdd830a95af8cf8", + "themeHash": "67d6de70e67967432dcafb51a491b2105f11f5f5024cb4f79e1c8aa29b3503b7", + "acquisitionFiles": { + "src/screens/about-422-3376.tsx": "72d92ac544a77e758fb6547b2085b984d82728cb814bcc2a0a25a7bc2b73827c", + "themes/about-422-3376.json": "67d6de70e67967432dcafb51a491b2105f11f5f5024cb4f79e1c8aa29b3503b7", + "out/about-422-3376.reference.png": "183b29572ab786dbe588e0bfed57db8210920e4f070dfb22226065a6545c17f8", + "out/about-422-3376-422-3376.snapshot.json": "6e68ee5121616f01497345619f8185f6c37fdab363d9132c388738fdd599ebdd", + "public/images/Section1-422-2989.png": "40b072777cb9dde85763e63e029239cb1d7e14409f8b316d7283697abcc53868", + "public/images/2-1-422-2991-04c06818b22f.png": "e6015ba1c9fb9303d471cf0eb7405afa8e255825684f506b7a0a53ff93fe9c8e", + "public/images/Frame-269-422-2996-e302b6b111d4.png": "6a0ae8afa45e6b73a2620d0545a7fed0445ff52515377d8b85db4889db2906ce", + "public/icons/file-analytic_14427169-1-422-3010-c18bf91459ac.svg": "9d7d47743459dc88c3f484fdbb53a5bb73fb1be608ba3a6852fcda731f144614", + "public/icons/shopping-list_1288709-1-422-3028-21f19fe34057.svg": "e94970ba54e1861da6777e7f8c1094161e9958c3cd7b43fb3ea73cd771cc6a12", + "public/icons/meeting_1621655-1-422-3059-fbf10cffffdc.svg": "3380c956ec0a7935618109ea320b56b56c8821f0e3d34023fa8a982998df1133", + "public/icons/422-3095-55250514fb17.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3097-0d37556a31a6.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/icons/puzzle_17833563-1-422-3100-68fcd7ce5191.svg": "f853f0aa03903d26ff4ac0658f81eaa357b78b9881b2e8d2c47ac345e879e38e", + "public/images/Frame-1000014115-422-3106-47c4161cbfdc.png": "dd6cb90a65d7ed388b93a7e3ce60b6c4138c54d23a5e24867ce02720b56202a1", + "public/images/Frame-256-422-3125-2-176f1c6fe3ab.png": "d966f8f5ee2c191a163fdb4a6b43c0f579b7f1811961fbda7362f927217d4ad5", + "public/icons/Frame-287-422-3133-3ccb13ba51fd.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3137-5e3d7d6e17fd.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3141-107eb1e2beea.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-257-422-3145-2-357f7710ea85.png": "5cf8ab0f1b8cd7b6c70ef03b2d3e15b2c7f67a9e3cb6013d1915c92c6e0cab88", + "public/icons/Frame-287-422-3150-12eb2516b4d2.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3154-a2eb9f1af7d7.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3158-4f13a54de65b.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-258-422-3162-2-e27c69996ca2.png": "f746a34333dfd09fc0507092b27c5300a0c76ec9d44e0ec87d712a410f8ef33b", + "public/icons/Frame-287-422-3167-54ec1d92f274.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-259-422-3171-2-a35dcd9fae03.png": "f6d9ffdbac3cc6d48554c6278019cb6a6184cb10d4670a3b7342808beec3d937", + "public/icons/Frame-287-422-3176-97916df902d3.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Section1-422-3183.png": "7720dc3e1f4c9659ffe9fe55604e4bdac5db1e04a7dad88d70890e3c9e7a9fe8", + "public/images/2-1-422-3185-c2c2bb9fd4ca.png": "1c38f71561ca2fd4aefa625958d9101e178e1540887049db544c37884f22dc79", + "public/images/Frame-269-422-3190-fd04b8b6b1f3.png": "47be398c71c507eede8a2545697ea8db2fe60a9cd2dbfe4d4ef777e7852454b3", + "public/icons/file-analytic_14427169-1-422-3204-432c13ca99bd.svg": "9d7d47743459dc88c3f484fdbb53a5bb73fb1be608ba3a6852fcda731f144614", + "public/icons/shopping-list_1288709-1-422-3222-b3e9e8487485.svg": "c7a372e75e151f942986fbe8a32a4b1a002ed0f105462a2284b3304d50af77ba", + "public/icons/meeting_1621655-1-422-3253-298cce04954e.svg": "39c1f190f5337a2ef2131d345ecb1cc385d7360861d517111901def4511fe106", + "public/icons/422-3289-1341670f1470.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3291-f455a67c7691.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/icons/puzzle_17833563-1-422-3294-2f23118b8931.svg": "b30a7b5201b6438bbe3fa0eede1f571bc14f7ca53cbb3e7cd6f073a1c7dea28a", + "public/images/Frame-1000014115-422-3300-897dd4548a76.png": "0f14e1f6ba38c889b2a79213a07671cbc7ff77bc64bf0b684ab5d828b0e47ff0", + "public/images/Frame-256-422-3320-2-2f4ae32bf58f.png": "d966f8f5ee2c191a163fdb4a6b43c0f579b7f1811961fbda7362f927217d4ad5", + "public/icons/Frame-287-422-3328-3a4711366ec2.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3332-afb9a56cd5bf.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3336-2f9cf19d6dce.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-257-422-3340-2-a9b56c699b23.png": "5cf8ab0f1b8cd7b6c70ef03b2d3e15b2c7f67a9e3cb6013d1915c92c6e0cab88", + "public/icons/Frame-287-422-3345-d5b693523dde.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3349-0d8a14703259.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3353-eaa50e1d86e7.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-258-422-3358-2-0adcc70fa0d7.png": "f746a34333dfd09fc0507092b27c5300a0c76ec9d44e0ec87d712a410f8ef33b", + "public/icons/Frame-287-422-3363-2b09fc7a41f0.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-259-422-3367-2-4d462c68adbb.png": "f6d9ffdbac3cc6d48554c6278019cb6a6184cb10d4670a3b7342808beec3d937", + "public/icons/Frame-287-422-3372-240bfbcd93a8.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Section1-422-3378.png": "ba4cd45f211bb5e4e73d4bf75981f6f2aed04575e1b82fbb4afbb09c80a92c1c", + "public/images/2-1-422-3380-cb2a0042a641.png": "a6604f6a23668a36fe7669bb7dae27e1303241e319ec3c5fc004cef912a4df27", + "public/images/Frame-269-422-3392-5be2d3573dd4.png": "856609c2b24d369580edb5cb87430ad33ea8fbc3f5a559fe8e9969c70b781931", + "public/icons/file-analytic_14427169-1-422-3399-139dd88e7135.svg": "0071bed431ba0fd316d73e20f975881603c259cbcd21ed7c1c6c327cd5a115b9", + "public/icons/shopping-list_1288709-1-422-3417-791e321745e1.svg": "03466401cfb2bdba43054fab1e191393bcf405cb23987e40ff32f20ebd264ab8", + "public/icons/meeting_1621655-1-422-3448-05d5b482e0b5.svg": "cbe97ff3f21e401fdea44bd56b50deb907688d9fe70a6ac359c43f72c8b0cb72", + "public/icons/puzzle_17833563-1-422-3481-a67ca4e245af.svg": "9e48c170db858584703aa6a6ad8ef1d87497787be9d78ae7e0b97ac707436b7d", + "public/icons/422-3486-2489fb200011.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3488-1c4e20055c2e.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/images/Frame-1000014115-422-3495-753f13b2e0dd.png": "8dbde872e57446334285215e31b7ce62888ecc6f734ef80d0b0cbf043fa71ab8", + "public/images/Frame-256-422-3514-2-ef1ce40418b8.png": "85a1ac763f2ba75cf4439afe43c79e93d3b9223698e5ddd6f27f7abfc44f5ff6", + "public/icons/Frame-287-422-3522-69bff93d7324.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3526-6b5842e92a01.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3530-14f6769de568.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-257-422-3534-2-48ea6bc9848a.png": "1ea58b9e09a248bcfa987612c7c9525cd5ac91c162d284c4ecfb163c135e3e7b", + "public/icons/Frame-287-422-3539-b40757ac8c31.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3543-518a0dce63b4.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3547-71792e0420f0.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-258-422-3551-2-212ce23b8c62.png": "bb6358a55187f71806b213afa22a8a631290f7643caa60099d70316682a4e42b", + "public/icons/Frame-287-422-3556-ef8452af3a3e.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-259-422-3560-2-502893d58465.png": "fbe4631ff8bd6375993763bb6c0e8cbd5c4cfe8bd27ec9e3765a2add021d43b9", + "public/icons/Frame-287-422-3565-d40d8a2c65bb.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-1000014286-I422-2988-935-102168-8297aaad000c.svg": "ffb8c9aa5bf5391a72f128243a4a31a4a1bb51f916ef9016c8c5ee65856e3972", + "public/icons/Container-I422-3179-1127-78173.svg": "8f3c2a9c29107bb5dce6c10f48884e532c086bf8cc85eed8e5495edc5dcdca0c", + "public/icons/Icons-location-60eb5ab59e5e.svg": "d3941032c41126ef38a5c1e529a4300029c2514f827b84319c54f87def94b031", + "public/icons/Icons-tel-b5d1fc7747cd.svg": "89a41a35802eb8d04d6716354e1d7058105fc13b8743210a0a7a4fbb18882493", + "public/icons/Icons-email-c8a6dae31bb4.svg": "1dcb7f565b0412e496f625d248ce973abc44b545b9ed7015644deaf0d6fac8ca", + "public/icons/Icons-insta-8f3f8e048fd3.svg": "5ccbd4b5ddacef31234d53d90993935ea6e65f138f31c607ee77b1c0c17954ed", + "public/icons/Icons-mention-a09d585d05ef.svg": "6a55243c947343a2d9d67a42382017a1fdf91ec52756833bdb8b9c583bb6eb53", + "public/icons/Icons-docs-7356013800c3.svg": "acad8716a68f6071b024beccd78080560cff32b1c3ee1a84082d75a360b7ec5e", + "public/icons/Frame-1000014286-I422-3182-935-102168-a94614c9360a.svg": "ffb8c9aa5bf5391a72f128243a4a31a4a1bb51f916ef9016c8c5ee65856e3972", + "public/icons/Container-I422-3375-1127-78173.svg": "8f3c2a9c29107bb5dce6c10f48884e532c086bf8cc85eed8e5495edc5dcdca0c", + "public/icons/Icons-hamburger-cf989eed2cd8.svg": "ac9e2bfeabbaa0102254d8f53bc597888c73af1e226ae0c4bc381ce90f1132d3", + "public/icons/Frame-1000014285-I422-3377-935-101749-cfb195196c6c.svg": "8a0565afa4709169455563a507331af0f1994406746f2f27b3c56f60dc265c77", + "public/icons/P-I422-3568-277-7767.svg": "682a7fb16df448d4c9435bcaf6306e79761e737490e852190478246303414c37", + "public/icons/Icons-arrow-abf22ae153b4.svg": "830d5a696d483574fe3c11135427ff47c9cb86f85984de47b694e64deef7c05c" + } + }, + { + "screen": "about-422-3180", + "environmentStatus": "valid", + "viewport": { + "width": 992, + "height": 5619 + }, + "rendered": { + "width": 992, + "height": 5620 + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 992, + 5619 + ], + "actualDimensions": [ + 992, + 5619 + ], + "changedPixels": 163529, + "totalPixels": 5574048, + "changedRatio": 0.02933756580495898, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 238, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W24-A-hero-export\\harness\\render\\out\\about-422-3180.diff.png" + }, + "binarySha256": "21f41954f76d4fe1fbe867191156fc8cc574879885062f792bdd830a95af8cf8", + "themeHash": "67d6de70e67967432dcafb51a491b2105f11f5f5024cb4f79e1c8aa29b3503b7", + "acquisitionFiles": { + "src/screens/about-422-3180.tsx": "c9f36e5ee08596368962f0872314b74fd7d83ce2f9e32c230400b3e1477ccb92", + "themes/about-422-3180.json": "67d6de70e67967432dcafb51a491b2105f11f5f5024cb4f79e1c8aa29b3503b7", + "out/about-422-3180.reference.png": "9487389f99ba9d199262ddf0c0e8acaed0679b0aadceeb535cecb99f6b3e1faa", + "out/about-422-3180-422-3180.snapshot.json": "6e68ee5121616f01497345619f8185f6c37fdab363d9132c388738fdd599ebdd", + "public/images/Section1-422-2989.png": "40b072777cb9dde85763e63e029239cb1d7e14409f8b316d7283697abcc53868", + "public/images/2-1-422-2991-04c06818b22f.png": "e6015ba1c9fb9303d471cf0eb7405afa8e255825684f506b7a0a53ff93fe9c8e", + "public/images/Frame-269-422-2996-e302b6b111d4.png": "6a0ae8afa45e6b73a2620d0545a7fed0445ff52515377d8b85db4889db2906ce", + "public/icons/file-analytic_14427169-1-422-3010-c18bf91459ac.svg": "9d7d47743459dc88c3f484fdbb53a5bb73fb1be608ba3a6852fcda731f144614", + "public/icons/shopping-list_1288709-1-422-3028-21f19fe34057.svg": "e94970ba54e1861da6777e7f8c1094161e9958c3cd7b43fb3ea73cd771cc6a12", + "public/icons/meeting_1621655-1-422-3059-fbf10cffffdc.svg": "3380c956ec0a7935618109ea320b56b56c8821f0e3d34023fa8a982998df1133", + "public/icons/422-3095-55250514fb17.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3097-0d37556a31a6.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/icons/puzzle_17833563-1-422-3100-68fcd7ce5191.svg": "f853f0aa03903d26ff4ac0658f81eaa357b78b9881b2e8d2c47ac345e879e38e", + "public/images/Frame-1000014115-422-3106-47c4161cbfdc.png": "dd6cb90a65d7ed388b93a7e3ce60b6c4138c54d23a5e24867ce02720b56202a1", + "public/images/Frame-256-422-3125-2-176f1c6fe3ab.png": "d966f8f5ee2c191a163fdb4a6b43c0f579b7f1811961fbda7362f927217d4ad5", + "public/icons/Frame-287-422-3133-3ccb13ba51fd.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3137-5e3d7d6e17fd.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3141-107eb1e2beea.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-257-422-3145-2-357f7710ea85.png": "5cf8ab0f1b8cd7b6c70ef03b2d3e15b2c7f67a9e3cb6013d1915c92c6e0cab88", + "public/icons/Frame-287-422-3150-12eb2516b4d2.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3154-a2eb9f1af7d7.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3158-4f13a54de65b.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-258-422-3162-2-e27c69996ca2.png": "f746a34333dfd09fc0507092b27c5300a0c76ec9d44e0ec87d712a410f8ef33b", + "public/icons/Frame-287-422-3167-54ec1d92f274.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-259-422-3171-2-a35dcd9fae03.png": "f6d9ffdbac3cc6d48554c6278019cb6a6184cb10d4670a3b7342808beec3d937", + "public/icons/Frame-287-422-3176-97916df902d3.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Section1-422-3183.png": "7720dc3e1f4c9659ffe9fe55604e4bdac5db1e04a7dad88d70890e3c9e7a9fe8", + "public/images/2-1-422-3185-c2c2bb9fd4ca.png": "1c38f71561ca2fd4aefa625958d9101e178e1540887049db544c37884f22dc79", + "public/images/Frame-269-422-3190-fd04b8b6b1f3.png": "47be398c71c507eede8a2545697ea8db2fe60a9cd2dbfe4d4ef777e7852454b3", + "public/icons/file-analytic_14427169-1-422-3204-432c13ca99bd.svg": "9d7d47743459dc88c3f484fdbb53a5bb73fb1be608ba3a6852fcda731f144614", + "public/icons/shopping-list_1288709-1-422-3222-b3e9e8487485.svg": "c7a372e75e151f942986fbe8a32a4b1a002ed0f105462a2284b3304d50af77ba", + "public/icons/meeting_1621655-1-422-3253-298cce04954e.svg": "39c1f190f5337a2ef2131d345ecb1cc385d7360861d517111901def4511fe106", + "public/icons/422-3289-1341670f1470.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3291-f455a67c7691.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/icons/puzzle_17833563-1-422-3294-2f23118b8931.svg": "b30a7b5201b6438bbe3fa0eede1f571bc14f7ca53cbb3e7cd6f073a1c7dea28a", + "public/images/Frame-1000014115-422-3300-897dd4548a76.png": "0f14e1f6ba38c889b2a79213a07671cbc7ff77bc64bf0b684ab5d828b0e47ff0", + "public/images/Frame-256-422-3320-2-2f4ae32bf58f.png": "d966f8f5ee2c191a163fdb4a6b43c0f579b7f1811961fbda7362f927217d4ad5", + "public/icons/Frame-287-422-3328-3a4711366ec2.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3332-afb9a56cd5bf.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3336-2f9cf19d6dce.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-257-422-3340-2-a9b56c699b23.png": "5cf8ab0f1b8cd7b6c70ef03b2d3e15b2c7f67a9e3cb6013d1915c92c6e0cab88", + "public/icons/Frame-287-422-3345-d5b693523dde.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3349-0d8a14703259.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3353-eaa50e1d86e7.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-258-422-3358-2-0adcc70fa0d7.png": "f746a34333dfd09fc0507092b27c5300a0c76ec9d44e0ec87d712a410f8ef33b", + "public/icons/Frame-287-422-3363-2b09fc7a41f0.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-259-422-3367-2-4d462c68adbb.png": "f6d9ffdbac3cc6d48554c6278019cb6a6184cb10d4670a3b7342808beec3d937", + "public/icons/Frame-287-422-3372-240bfbcd93a8.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Section1-422-3378.png": "ba4cd45f211bb5e4e73d4bf75981f6f2aed04575e1b82fbb4afbb09c80a92c1c", + "public/images/2-1-422-3380-cb2a0042a641.png": "a6604f6a23668a36fe7669bb7dae27e1303241e319ec3c5fc004cef912a4df27", + "public/images/Frame-269-422-3392-5be2d3573dd4.png": "856609c2b24d369580edb5cb87430ad33ea8fbc3f5a559fe8e9969c70b781931", + "public/icons/file-analytic_14427169-1-422-3399-139dd88e7135.svg": "0071bed431ba0fd316d73e20f975881603c259cbcd21ed7c1c6c327cd5a115b9", + "public/icons/shopping-list_1288709-1-422-3417-791e321745e1.svg": "03466401cfb2bdba43054fab1e191393bcf405cb23987e40ff32f20ebd264ab8", + "public/icons/meeting_1621655-1-422-3448-05d5b482e0b5.svg": "cbe97ff3f21e401fdea44bd56b50deb907688d9fe70a6ac359c43f72c8b0cb72", + "public/icons/puzzle_17833563-1-422-3481-a67ca4e245af.svg": "9e48c170db858584703aa6a6ad8ef1d87497787be9d78ae7e0b97ac707436b7d", + "public/icons/422-3486-2489fb200011.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3488-1c4e20055c2e.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/images/Frame-1000014115-422-3495-753f13b2e0dd.png": "8dbde872e57446334285215e31b7ce62888ecc6f734ef80d0b0cbf043fa71ab8", + "public/images/Frame-256-422-3514-2-ef1ce40418b8.png": "85a1ac763f2ba75cf4439afe43c79e93d3b9223698e5ddd6f27f7abfc44f5ff6", + "public/icons/Frame-287-422-3522-69bff93d7324.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3526-6b5842e92a01.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3530-14f6769de568.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-257-422-3534-2-48ea6bc9848a.png": "1ea58b9e09a248bcfa987612c7c9525cd5ac91c162d284c4ecfb163c135e3e7b", + "public/icons/Frame-287-422-3539-b40757ac8c31.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3543-518a0dce63b4.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3547-71792e0420f0.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-258-422-3551-2-212ce23b8c62.png": "bb6358a55187f71806b213afa22a8a631290f7643caa60099d70316682a4e42b", + "public/icons/Frame-287-422-3556-ef8452af3a3e.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-259-422-3560-2-502893d58465.png": "fbe4631ff8bd6375993763bb6c0e8cbd5c4cfe8bd27ec9e3765a2add021d43b9", + "public/icons/Frame-287-422-3565-d40d8a2c65bb.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-1000014286-I422-2988-935-102168-8297aaad000c.svg": "ffb8c9aa5bf5391a72f128243a4a31a4a1bb51f916ef9016c8c5ee65856e3972", + "public/icons/Container-I422-3179-1127-78173.svg": "8f3c2a9c29107bb5dce6c10f48884e532c086bf8cc85eed8e5495edc5dcdca0c", + "public/icons/Icons-location-60eb5ab59e5e.svg": "d3941032c41126ef38a5c1e529a4300029c2514f827b84319c54f87def94b031", + "public/icons/Icons-tel-b5d1fc7747cd.svg": "89a41a35802eb8d04d6716354e1d7058105fc13b8743210a0a7a4fbb18882493", + "public/icons/Icons-email-c8a6dae31bb4.svg": "1dcb7f565b0412e496f625d248ce973abc44b545b9ed7015644deaf0d6fac8ca", + "public/icons/Icons-insta-8f3f8e048fd3.svg": "5ccbd4b5ddacef31234d53d90993935ea6e65f138f31c607ee77b1c0c17954ed", + "public/icons/Icons-mention-a09d585d05ef.svg": "6a55243c947343a2d9d67a42382017a1fdf91ec52756833bdb8b9c583bb6eb53", + "public/icons/Icons-docs-7356013800c3.svg": "acad8716a68f6071b024beccd78080560cff32b1c3ee1a84082d75a360b7ec5e", + "public/icons/Frame-1000014286-I422-3182-935-102168-a94614c9360a.svg": "ffb8c9aa5bf5391a72f128243a4a31a4a1bb51f916ef9016c8c5ee65856e3972", + "public/icons/Container-I422-3375-1127-78173.svg": "8f3c2a9c29107bb5dce6c10f48884e532c086bf8cc85eed8e5495edc5dcdca0c", + "public/icons/Icons-hamburger-cf989eed2cd8.svg": "ac9e2bfeabbaa0102254d8f53bc597888c73af1e226ae0c4bc381ce90f1132d3", + "public/icons/Frame-1000014285-I422-3377-935-101749-cfb195196c6c.svg": "8a0565afa4709169455563a507331af0f1994406746f2f27b3c56f60dc265c77", + "public/icons/P-I422-3568-277-7767.svg": "682a7fb16df448d4c9435bcaf6306e79761e737490e852190478246303414c37", + "public/icons/Icons-arrow-abf22ae153b4.svg": "830d5a696d483574fe3c11135427ff47c9cb86f85984de47b694e64deef7c05c" + } + }, + { + "screen": "about-422-2987", + "environmentStatus": "valid", + "viewport": { + "width": 1920, + "height": 4757 + }, + "rendered": { + "width": 1920, + "height": 4758 + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 1920, + 4757 + ], + "actualDimensions": [ + 1920, + 4757 + ], + "changedPixels": 161504, + "totalPixels": 9133440, + "changedRatio": 0.01768271319459043, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 238, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W24-A-hero-export\\harness\\render\\out\\about-422-2987.diff.png" + }, + "binarySha256": "21f41954f76d4fe1fbe867191156fc8cc574879885062f792bdd830a95af8cf8", + "themeHash": "67d6de70e67967432dcafb51a491b2105f11f5f5024cb4f79e1c8aa29b3503b7", + "acquisitionFiles": { + "src/screens/about-422-2987.tsx": "e0c1ba3c07a85b4a785906a74383ec9c35480a7e95a8d81ecd3df2506fd5f7e6", + "themes/about-422-2987.json": "67d6de70e67967432dcafb51a491b2105f11f5f5024cb4f79e1c8aa29b3503b7", + "out/about-422-2987.reference.png": "6dc173242afb2bc5ad5d7262d4d23acd1ec7fcc468db32c413cc5356b3dd9120", + "out/about-422-2987-422-2987.snapshot.json": "6e68ee5121616f01497345619f8185f6c37fdab363d9132c388738fdd599ebdd", + "public/images/Section1-422-2989.png": "40b072777cb9dde85763e63e029239cb1d7e14409f8b316d7283697abcc53868", + "public/images/2-1-422-2991-04c06818b22f.png": "e6015ba1c9fb9303d471cf0eb7405afa8e255825684f506b7a0a53ff93fe9c8e", + "public/images/Frame-269-422-2996-e302b6b111d4.png": "6a0ae8afa45e6b73a2620d0545a7fed0445ff52515377d8b85db4889db2906ce", + "public/icons/file-analytic_14427169-1-422-3010-c18bf91459ac.svg": "9d7d47743459dc88c3f484fdbb53a5bb73fb1be608ba3a6852fcda731f144614", + "public/icons/shopping-list_1288709-1-422-3028-21f19fe34057.svg": "e94970ba54e1861da6777e7f8c1094161e9958c3cd7b43fb3ea73cd771cc6a12", + "public/icons/meeting_1621655-1-422-3059-fbf10cffffdc.svg": "3380c956ec0a7935618109ea320b56b56c8821f0e3d34023fa8a982998df1133", + "public/icons/422-3095-55250514fb17.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3097-0d37556a31a6.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/icons/puzzle_17833563-1-422-3100-68fcd7ce5191.svg": "f853f0aa03903d26ff4ac0658f81eaa357b78b9881b2e8d2c47ac345e879e38e", + "public/images/Frame-1000014115-422-3106-47c4161cbfdc.png": "dd6cb90a65d7ed388b93a7e3ce60b6c4138c54d23a5e24867ce02720b56202a1", + "public/images/Frame-256-422-3125-2-176f1c6fe3ab.png": "d966f8f5ee2c191a163fdb4a6b43c0f579b7f1811961fbda7362f927217d4ad5", + "public/icons/Frame-287-422-3133-3ccb13ba51fd.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3137-5e3d7d6e17fd.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3141-107eb1e2beea.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-257-422-3145-2-357f7710ea85.png": "5cf8ab0f1b8cd7b6c70ef03b2d3e15b2c7f67a9e3cb6013d1915c92c6e0cab88", + "public/icons/Frame-287-422-3150-12eb2516b4d2.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3154-a2eb9f1af7d7.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3158-4f13a54de65b.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-258-422-3162-2-e27c69996ca2.png": "f746a34333dfd09fc0507092b27c5300a0c76ec9d44e0ec87d712a410f8ef33b", + "public/icons/Frame-287-422-3167-54ec1d92f274.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-259-422-3171-2-a35dcd9fae03.png": "f6d9ffdbac3cc6d48554c6278019cb6a6184cb10d4670a3b7342808beec3d937", + "public/icons/Frame-287-422-3176-97916df902d3.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Section1-422-3183.png": "7720dc3e1f4c9659ffe9fe55604e4bdac5db1e04a7dad88d70890e3c9e7a9fe8", + "public/images/2-1-422-3185-c2c2bb9fd4ca.png": "1c38f71561ca2fd4aefa625958d9101e178e1540887049db544c37884f22dc79", + "public/images/Frame-269-422-3190-fd04b8b6b1f3.png": "47be398c71c507eede8a2545697ea8db2fe60a9cd2dbfe4d4ef777e7852454b3", + "public/icons/file-analytic_14427169-1-422-3204-432c13ca99bd.svg": "9d7d47743459dc88c3f484fdbb53a5bb73fb1be608ba3a6852fcda731f144614", + "public/icons/shopping-list_1288709-1-422-3222-b3e9e8487485.svg": "c7a372e75e151f942986fbe8a32a4b1a002ed0f105462a2284b3304d50af77ba", + "public/icons/meeting_1621655-1-422-3253-298cce04954e.svg": "39c1f190f5337a2ef2131d345ecb1cc385d7360861d517111901def4511fe106", + "public/icons/422-3289-1341670f1470.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3291-f455a67c7691.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/icons/puzzle_17833563-1-422-3294-2f23118b8931.svg": "b30a7b5201b6438bbe3fa0eede1f571bc14f7ca53cbb3e7cd6f073a1c7dea28a", + "public/images/Frame-1000014115-422-3300-897dd4548a76.png": "0f14e1f6ba38c889b2a79213a07671cbc7ff77bc64bf0b684ab5d828b0e47ff0", + "public/images/Frame-256-422-3320-2-2f4ae32bf58f.png": "d966f8f5ee2c191a163fdb4a6b43c0f579b7f1811961fbda7362f927217d4ad5", + "public/icons/Frame-287-422-3328-3a4711366ec2.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3332-afb9a56cd5bf.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3336-2f9cf19d6dce.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-257-422-3340-2-a9b56c699b23.png": "5cf8ab0f1b8cd7b6c70ef03b2d3e15b2c7f67a9e3cb6013d1915c92c6e0cab88", + "public/icons/Frame-287-422-3345-d5b693523dde.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3349-0d8a14703259.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3353-eaa50e1d86e7.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-258-422-3358-2-0adcc70fa0d7.png": "f746a34333dfd09fc0507092b27c5300a0c76ec9d44e0ec87d712a410f8ef33b", + "public/icons/Frame-287-422-3363-2b09fc7a41f0.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-259-422-3367-2-4d462c68adbb.png": "f6d9ffdbac3cc6d48554c6278019cb6a6184cb10d4670a3b7342808beec3d937", + "public/icons/Frame-287-422-3372-240bfbcd93a8.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Section1-422-3378.png": "ba4cd45f211bb5e4e73d4bf75981f6f2aed04575e1b82fbb4afbb09c80a92c1c", + "public/images/2-1-422-3380-cb2a0042a641.png": "a6604f6a23668a36fe7669bb7dae27e1303241e319ec3c5fc004cef912a4df27", + "public/images/Frame-269-422-3392-5be2d3573dd4.png": "856609c2b24d369580edb5cb87430ad33ea8fbc3f5a559fe8e9969c70b781931", + "public/icons/file-analytic_14427169-1-422-3399-139dd88e7135.svg": "0071bed431ba0fd316d73e20f975881603c259cbcd21ed7c1c6c327cd5a115b9", + "public/icons/shopping-list_1288709-1-422-3417-791e321745e1.svg": "03466401cfb2bdba43054fab1e191393bcf405cb23987e40ff32f20ebd264ab8", + "public/icons/meeting_1621655-1-422-3448-05d5b482e0b5.svg": "cbe97ff3f21e401fdea44bd56b50deb907688d9fe70a6ac359c43f72c8b0cb72", + "public/icons/puzzle_17833563-1-422-3481-a67ca4e245af.svg": "9e48c170db858584703aa6a6ad8ef1d87497787be9d78ae7e0b97ac707436b7d", + "public/icons/422-3486-2489fb200011.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3488-1c4e20055c2e.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/images/Frame-1000014115-422-3495-753f13b2e0dd.png": "8dbde872e57446334285215e31b7ce62888ecc6f734ef80d0b0cbf043fa71ab8", + "public/images/Frame-256-422-3514-2-ef1ce40418b8.png": "85a1ac763f2ba75cf4439afe43c79e93d3b9223698e5ddd6f27f7abfc44f5ff6", + "public/icons/Frame-287-422-3522-69bff93d7324.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3526-6b5842e92a01.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3530-14f6769de568.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-257-422-3534-2-48ea6bc9848a.png": "1ea58b9e09a248bcfa987612c7c9525cd5ac91c162d284c4ecfb163c135e3e7b", + "public/icons/Frame-287-422-3539-b40757ac8c31.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3543-518a0dce63b4.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3547-71792e0420f0.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-258-422-3551-2-212ce23b8c62.png": "bb6358a55187f71806b213afa22a8a631290f7643caa60099d70316682a4e42b", + "public/icons/Frame-287-422-3556-ef8452af3a3e.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-259-422-3560-2-502893d58465.png": "fbe4631ff8bd6375993763bb6c0e8cbd5c4cfe8bd27ec9e3765a2add021d43b9", + "public/icons/Frame-287-422-3565-d40d8a2c65bb.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-1000014286-I422-2988-935-102168-8297aaad000c.svg": "ffb8c9aa5bf5391a72f128243a4a31a4a1bb51f916ef9016c8c5ee65856e3972", + "public/icons/Container-I422-3179-1127-78173.svg": "8f3c2a9c29107bb5dce6c10f48884e532c086bf8cc85eed8e5495edc5dcdca0c", + "public/icons/Icons-location-60eb5ab59e5e.svg": "d3941032c41126ef38a5c1e529a4300029c2514f827b84319c54f87def94b031", + "public/icons/Icons-tel-b5d1fc7747cd.svg": "89a41a35802eb8d04d6716354e1d7058105fc13b8743210a0a7a4fbb18882493", + "public/icons/Icons-email-c8a6dae31bb4.svg": "1dcb7f565b0412e496f625d248ce973abc44b545b9ed7015644deaf0d6fac8ca", + "public/icons/Icons-insta-8f3f8e048fd3.svg": "5ccbd4b5ddacef31234d53d90993935ea6e65f138f31c607ee77b1c0c17954ed", + "public/icons/Icons-mention-a09d585d05ef.svg": "6a55243c947343a2d9d67a42382017a1fdf91ec52756833bdb8b9c583bb6eb53", + "public/icons/Icons-docs-7356013800c3.svg": "acad8716a68f6071b024beccd78080560cff32b1c3ee1a84082d75a360b7ec5e", + "public/icons/Frame-1000014286-I422-3182-935-102168-a94614c9360a.svg": "ffb8c9aa5bf5391a72f128243a4a31a4a1bb51f916ef9016c8c5ee65856e3972", + "public/icons/Container-I422-3375-1127-78173.svg": "8f3c2a9c29107bb5dce6c10f48884e532c086bf8cc85eed8e5495edc5dcdca0c", + "public/icons/Icons-hamburger-cf989eed2cd8.svg": "ac9e2bfeabbaa0102254d8f53bc597888c73af1e226ae0c4bc381ce90f1132d3", + "public/icons/Frame-1000014285-I422-3377-935-101749-cfb195196c6c.svg": "8a0565afa4709169455563a507331af0f1994406746f2f27b3c56f60dc265c77", + "public/icons/P-I422-3568-277-7767.svg": "682a7fb16df448d4c9435bcaf6306e79761e737490e852190478246303414c37", + "public/icons/Icons-arrow-abf22ae153b4.svg": "830d5a696d483574fe3c11135427ff47c9cb86f85984de47b694e64deef7c05c" + } + } + ] + ], + "baselineActualHashes": { + "about-422-3376": "b5b4811070234e052c2f0ecbf2405ecced400aa14a0813661c2331a70899505b", + "about-422-3180": "ea08e788ce5c65d1d2c6377a022a3934c6d0707ec1a4c73eedb690c6161627a2", + "about-422-2987": "1ff44ea5a12777ee3c5f13e8bc0edc5a1aca42c5d6cea8ae2f426438c91a9145" + }, + "contractProbe": { + "tolerance": 24, + "hero": [ + { + "screen": "about-422-3376", + "nodeId": "422:3378", + "assetId": "422:3378:fills:0", + "assetPath": "public/images/Section1-422-3378.png", + "bounds": [ + 0, + 46, + 360, + 520 + ], + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "09939a0d306a1dc967f5f04afa6756203ca92dec", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "rotation": 0, + "scaleMode": "FILL", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + }, + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 0.699999988079071, + "type": "SOLID", + "visible": true + } + ], + "childIds": [ + "422:3379" + ], + "assetSha256": "ba4cd45f211bb5e4e73d4bf75981f6f2aed04575e1b82fbb4afbb09c80a92c1c", + "referenceSha256": "183b29572ab786dbe588e0bfed57db8210920e4f070dfb22226065a6545c17f8", + "exportVsReferenceChangedPixels": 0, + "actualSha256": "b5b4811070234e052c2f0ecbf2405ecced400aa14a0813661c2331a70899505b", + "actualVsReferenceChangedPixels": 9217 + }, + { + "screen": "about-422-3180", + "nodeId": "422:3183", + "assetId": "422:3183:fills:0", + "assetPath": "public/images/Section1-422-3183.png", + "bounds": [ + 0, + 64, + 992, + 400 + ], + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "09939a0d306a1dc967f5f04afa6756203ca92dec", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "rotation": 0, + "scaleMode": "FILL", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + }, + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 0.699999988079071, + "type": "SOLID", + "visible": true + } + ], + "childIds": [ + "422:3184" + ], + "assetSha256": "7720dc3e1f4c9659ffe9fe55604e4bdac5db1e04a7dad88d70890e3c9e7a9fe8", + "referenceSha256": "9487389f99ba9d199262ddf0c0e8acaed0679b0aadceeb535cecb99f6b3e1faa", + "exportVsReferenceChangedPixels": 0, + "actualSha256": "ea08e788ce5c65d1d2c6377a022a3934c6d0707ec1a4c73eedb690c6161627a2", + "actualVsReferenceChangedPixels": 13058 + }, + { + "screen": "about-422-2987", + "nodeId": "422:2989", + "assetId": "422:2989:fills:0", + "assetPath": "public/images/Section1-422-2989.png", + "bounds": [ + 0, + 64, + 1920, + 400 + ], + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "09939a0d306a1dc967f5f04afa6756203ca92dec", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 1, + 0 + ] + ], + "opacity": 1, + "rotation": 0, + "scaleMode": "FILL", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + }, + { + "blendMode": "NORMAL", + "boundVariables": {}, + "color": { + "b": 1, + "g": 1, + "r": 1 + }, + "opacity": 0.699999988079071, + "type": "SOLID", + "visible": true + } + ], + "childIds": [ + "422:2990" + ], + "assetSha256": "40b072777cb9dde85763e63e029239cb1d7e14409f8b316d7283697abcc53868", + "referenceSha256": "6dc173242afb2bc5ad5d7262d4d23acd1ec7fcc468db32c413cc5356b3dd9120", + "exportVsReferenceChangedPixels": 0, + "actualSha256": "1ff44ea5a12777ee3c5f13e8bc0edc5a1aca42c5d6cea8ae2f426438c91a9145", + "actualVsReferenceChangedPixels": 12922 + } + ], + "crop": [ + { + "screen": "about-422-3376", + "nodeId": "422:3560", + "assetId": "422:3560:fills:2", + "assetPath": "public/images/Frame-259-422-3560-2-502893d58465.png", + "bounds": [ + 30, + 6275, + 300, + 400 + ], + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "ab3880767ae1e2dd94d3a91c03c26392199271c0", + "imageTransform": [ + [ + 1, + 0, + -1.4210854715202004e-14 + ], + [ + 0, + 0.8575537800788879, + 0.00833586324006319 + ] + ], + "opacity": 1, + "scaleMode": "CROP", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": false + }, + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:422:3781", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9215686321258544, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + }, + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "519055fb73d512870d866e9ef3f0b2c09add1e87", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 0.8511677980422974, + 0.04480081424117088 + ] + ], + "opacity": 1, + "scaleMode": "CROP", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + } + ], + "childIds": [], + "assetSha256": "fbe4631ff8bd6375993763bb6c0e8cbd5c4cfe8bd27ec9e3765a2add021d43b9", + "referenceSha256": "183b29572ab786dbe588e0bfed57db8210920e4f070dfb22226065a6545c17f8", + "exportVsReferenceChangedPixels": 0, + "actualSha256": "b5b4811070234e052c2f0ecbf2405ecced400aa14a0813661c2331a70899505b", + "actualVsReferenceChangedPixels": 0 + }, + { + "screen": "about-422-3376", + "nodeId": "422:3551", + "assetId": "422:3551:fills:2", + "assetPath": "public/images/Frame-258-422-3551-2-212ce23b8c62.png", + "bounds": [ + 30, + 5746, + 300, + 400 + ], + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "e159e8861126b45cd297c48ed9f7e60f08d314e0", + "imageTransform": [ + [ + 1, + 0, + -1.4210854715202004e-14 + ], + [ + 0, + 0.8572403788566589, + 0.008515546098351479 + ] + ], + "opacity": 1, + "scaleMode": "CROP", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": false + }, + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:422:3781", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9215686321258544, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + }, + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "b1ef2c049ef44d75ca50608e136b185f246a4a07", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 0.8508567214012146, + 0.036508746445178986 + ] + ], + "opacity": 1, + "scaleMode": "CROP", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + } + ], + "childIds": [], + "assetSha256": "bb6358a55187f71806b213afa22a8a631290f7643caa60099d70316682a4e42b", + "referenceSha256": "183b29572ab786dbe588e0bfed57db8210920e4f070dfb22226065a6545c17f8", + "exportVsReferenceChangedPixels": 0, + "actualSha256": "b5b4811070234e052c2f0ecbf2405ecced400aa14a0813661c2331a70899505b", + "actualVsReferenceChangedPixels": 0 + }, + { + "screen": "about-422-3376", + "nodeId": "422:3514", + "assetId": "422:3514:fills:2", + "assetPath": "public/images/Frame-256-422-3514-2-ef1ce40418b8.png", + "bounds": [ + 30, + 4514, + 300, + 400 + ], + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "1e7af0f5fcc94faf3b675bdf4d0bd1148b3a1c51", + "imageTransform": [ + [ + 1, + 0, + -1.4210854715202004e-14 + ], + [ + 0, + 0.856992781162262, + 0.010561937466263773 + ] + ], + "opacity": 1, + "rotation": 0, + "scaleMode": "FILL", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": false + }, + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:422:3781", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9215686321258544, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + }, + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "5b094cfd23e732669774034eb6fcfe3a26f7dc63", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 0.8328898549079895, + 0.00674342131242156 + ] + ], + "opacity": 1, + "scaleMode": "CROP", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + } + ], + "childIds": [], + "assetSha256": "85a1ac763f2ba75cf4439afe43c79e93d3b9223698e5ddd6f27f7abfc44f5ff6", + "referenceSha256": "183b29572ab786dbe588e0bfed57db8210920e4f070dfb22226065a6545c17f8", + "exportVsReferenceChangedPixels": 0, + "actualSha256": "b5b4811070234e052c2f0ecbf2405ecced400aa14a0813661c2331a70899505b", + "actualVsReferenceChangedPixels": 0 + }, + { + "screen": "about-422-3180", + "nodeId": "422:3367", + "assetId": "422:3367:fills:2", + "assetPath": "public/images/Frame-259-422-3367-2-4d462c68adbb.png", + "bounds": [ + 506, + 4612, + 305, + 400 + ], + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "ab3880767ae1e2dd94d3a91c03c26392199271c0", + "imageTransform": [ + [ + 1, + 0, + -1.4210854715202004e-14 + ], + [ + 0, + 0.8575537800788879, + 0.00833586324006319 + ] + ], + "opacity": 1, + "scaleMode": "CROP", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": false + }, + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:422:3781", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9215686321258544, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + }, + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "519055fb73d512870d866e9ef3f0b2c09add1e87", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 0.8511677980422974, + 0.017015771940350533 + ] + ], + "opacity": 1, + "scaleMode": "CROP", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + } + ], + "childIds": [], + "assetSha256": "f6d9ffdbac3cc6d48554c6278019cb6a6184cb10d4670a3b7342808beec3d937", + "referenceSha256": "9487389f99ba9d199262ddf0c0e8acaed0679b0aadceeb535cecb99f6b3e1faa", + "exportVsReferenceChangedPixels": 0, + "actualSha256": "ea08e788ce5c65d1d2c6377a022a3934c6d0707ec1a4c73eedb690c6161627a2", + "actualVsReferenceChangedPixels": 2254 + }, + { + "screen": "about-422-3180", + "nodeId": "422:3358", + "assetId": "422:3358:fills:2", + "assetPath": "public/images/Frame-258-422-3358-2-0adcc70fa0d7.png", + "bounds": [ + 181, + 4612, + 305, + 400 + ], + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "e159e8861126b45cd297c48ed9f7e60f08d314e0", + "imageTransform": [ + [ + 1, + 0, + -1.4210854715202004e-14 + ], + [ + 0, + 0.8572403788566589, + 0.008515546098351479 + ] + ], + "opacity": 1, + "scaleMode": "CROP", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": false + }, + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:422:3781", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9215686321258544, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + }, + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "b1ef2c049ef44d75ca50608e136b185f246a4a07", + "imageTransform": [ + [ + 1, + 0, + -0.0030579331796616316 + ], + [ + 0, + 0.8508567214012146, + 0.016669539734721184 + ] + ], + "opacity": 1, + "scaleMode": "CROP", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + } + ], + "childIds": [], + "assetSha256": "f746a34333dfd09fc0507092b27c5300a0c76ec9d44e0ec87d712a410f8ef33b", + "referenceSha256": "9487389f99ba9d199262ddf0c0e8acaed0679b0aadceeb535cecb99f6b3e1faa", + "exportVsReferenceChangedPixels": 0, + "actualSha256": "ea08e788ce5c65d1d2c6377a022a3934c6d0707ec1a4c73eedb690c6161627a2", + "actualVsReferenceChangedPixels": 2467 + }, + { + "screen": "about-422-3180", + "nodeId": "422:3340", + "assetId": "422:3340:fills:2", + "assetPath": "public/images/Frame-257-422-3340-2-a9b56c699b23.png", + "bounds": [ + 506, + 3978, + 305, + 400 + ], + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "1179a834d8e0994450403815221757ee93b76121", + "imageTransform": [ + [ + 1, + 0, + -1.4210854715202004e-14 + ], + [ + 0, + 0.8574491143226624, + 0.02554485574364662 + ] + ], + "opacity": 1, + "scaleMode": "CROP", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": false + }, + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:422:3781", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9215686321258544, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + }, + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "962370ac8fa6e0fa9581925e6deb73aded3625d3", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 0.874316930770874, + 0.05264841392636299 + ] + ], + "opacity": 1, + "scaleMode": "CROP", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + } + ], + "childIds": [], + "assetSha256": "5cf8ab0f1b8cd7b6c70ef03b2d3e15b2c7f67a9e3cb6013d1915c92c6e0cab88", + "referenceSha256": "9487389f99ba9d199262ddf0c0e8acaed0679b0aadceeb535cecb99f6b3e1faa", + "exportVsReferenceChangedPixels": 0, + "actualSha256": "ea08e788ce5c65d1d2c6377a022a3934c6d0707ec1a4c73eedb690c6161627a2", + "actualVsReferenceChangedPixels": 2374 + }, + { + "screen": "about-422-3180", + "nodeId": "422:3320", + "assetId": "422:3320:fills:2", + "assetPath": "public/images/Frame-256-422-3320-2-2f4ae32bf58f.png", + "bounds": [ + 181, + 3978, + 305, + 400 + ], + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "1e7af0f5fcc94faf3b675bdf4d0bd1148b3a1c51", + "imageTransform": [ + [ + 1, + 0, + -1.4210854715202004e-14 + ], + [ + 0, + 0.856992781162262, + 0.010561937466263773 + ] + ], + "opacity": 1, + "rotation": 0, + "scaleMode": "FILL", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": false + }, + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:422:3781", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9215686321258544, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + }, + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "5b094cfd23e732669774034eb6fcfe3a26f7dc63", + "imageTransform": [ + [ + 1.0957937240600586, + 0, + -0.051260415464639664 + ], + [ + 0, + 0.9575611352920532, + -0.011001000180840492 + ] + ], + "opacity": 1, + "scaleMode": "CROP", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + } + ], + "childIds": [], + "assetSha256": "d966f8f5ee2c191a163fdb4a6b43c0f579b7f1811961fbda7362f927217d4ad5", + "referenceSha256": "9487389f99ba9d199262ddf0c0e8acaed0679b0aadceeb535cecb99f6b3e1faa", + "exportVsReferenceChangedPixels": 0, + "actualSha256": "ea08e788ce5c65d1d2c6377a022a3934c6d0707ec1a4c73eedb690c6161627a2", + "actualVsReferenceChangedPixels": 2105 + }, + { + "screen": "about-422-2987", + "nodeId": "422:3171", + "assetId": "422:3171:fills:2", + "assetPath": "public/images/Frame-259-422-3171-2-a35dcd9fae03.png", + "bounds": [ + 1295, + 3655, + 305, + 400 + ], + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "ab3880767ae1e2dd94d3a91c03c26392199271c0", + "imageTransform": [ + [ + 1, + 0, + -1.4210854715202004e-14 + ], + [ + 0, + 0.8575537800788879, + 0.00833586324006319 + ] + ], + "opacity": 1, + "scaleMode": "CROP", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": false + }, + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:422:3781", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9215686321258544, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + }, + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "519055fb73d512870d866e9ef3f0b2c09add1e87", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 0.8511677980422974, + 0.017015771940350533 + ] + ], + "opacity": 1, + "scaleMode": "CROP", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + } + ], + "childIds": [], + "assetSha256": "f6d9ffdbac3cc6d48554c6278019cb6a6184cb10d4670a3b7342808beec3d937", + "referenceSha256": "6dc173242afb2bc5ad5d7262d4d23acd1ec7fcc468db32c413cc5356b3dd9120", + "exportVsReferenceChangedPixels": 0, + "actualSha256": "1ff44ea5a12777ee3c5f13e8bc0edc5a1aca42c5d6cea8ae2f426438c91a9145", + "actualVsReferenceChangedPixels": 2254 + }, + { + "screen": "about-422-2987", + "nodeId": "422:3162", + "assetId": "422:3162:fills:2", + "assetPath": "public/images/Frame-258-422-3162-2-e27c69996ca2.png", + "bounds": [ + 970, + 3655, + 305, + 400 + ], + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "e159e8861126b45cd297c48ed9f7e60f08d314e0", + "imageTransform": [ + [ + 1, + 0, + -1.4210854715202004e-14 + ], + [ + 0, + 0.8572403788566589, + 0.008515546098351479 + ] + ], + "opacity": 1, + "scaleMode": "CROP", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": false + }, + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:422:3781", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9215686321258544, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + }, + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "b1ef2c049ef44d75ca50608e136b185f246a4a07", + "imageTransform": [ + [ + 1, + 0, + -0.0030579331796616316 + ], + [ + 0, + 0.8508567214012146, + 0.016669539734721184 + ] + ], + "opacity": 1, + "scaleMode": "CROP", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + } + ], + "childIds": [], + "assetSha256": "f746a34333dfd09fc0507092b27c5300a0c76ec9d44e0ec87d712a410f8ef33b", + "referenceSha256": "6dc173242afb2bc5ad5d7262d4d23acd1ec7fcc468db32c413cc5356b3dd9120", + "exportVsReferenceChangedPixels": 0, + "actualSha256": "1ff44ea5a12777ee3c5f13e8bc0edc5a1aca42c5d6cea8ae2f426438c91a9145", + "actualVsReferenceChangedPixels": 2466 + }, + { + "screen": "about-422-2987", + "nodeId": "422:3145", + "assetId": "422:3145:fills:2", + "assetPath": "public/images/Frame-257-422-3145-2-357f7710ea85.png", + "bounds": [ + 645, + 3655, + 305, + 400 + ], + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "1179a834d8e0994450403815221757ee93b76121", + "imageTransform": [ + [ + 1, + 0, + -1.4210854715202004e-14 + ], + [ + 0, + 0.8574491143226624, + 0.02554485574364662 + ] + ], + "opacity": 1, + "scaleMode": "CROP", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": false + }, + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:422:3781", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9215686321258544, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + }, + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "962370ac8fa6e0fa9581925e6deb73aded3625d3", + "imageTransform": [ + [ + 1, + 0, + 0 + ], + [ + 0, + 0.874316930770874, + 0.05264841392636299 + ] + ], + "opacity": 1, + "scaleMode": "CROP", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + } + ], + "childIds": [], + "assetSha256": "5cf8ab0f1b8cd7b6c70ef03b2d3e15b2c7f67a9e3cb6013d1915c92c6e0cab88", + "referenceSha256": "6dc173242afb2bc5ad5d7262d4d23acd1ec7fcc468db32c413cc5356b3dd9120", + "exportVsReferenceChangedPixels": 0, + "actualSha256": "1ff44ea5a12777ee3c5f13e8bc0edc5a1aca42c5d6cea8ae2f426438c91a9145", + "actualVsReferenceChangedPixels": 2374 + }, + { + "screen": "about-422-2987", + "nodeId": "422:3125", + "assetId": "422:3125:fills:2", + "assetPath": "public/images/Frame-256-422-3125-2-176f1c6fe3ab.png", + "bounds": [ + 320, + 3655, + 305, + 400 + ], + "fills": [ + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "1e7af0f5fcc94faf3b675bdf4d0bd1148b3a1c51", + "imageTransform": [ + [ + 1, + 0, + -1.4210854715202004e-14 + ], + [ + 0, + 0.856992781162262, + 0.010561937466263773 + ] + ], + "opacity": 1, + "rotation": 0, + "scaleMode": "FILL", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": false + }, + { + "blendMode": "NORMAL", + "boundVariables": { + "color": { + "id": "VariableID:422:3781", + "type": "VARIABLE_ALIAS" + } + }, + "color": { + "b": 0.9215686321258544, + "g": 0.9058823585510254, + "r": 0.8980392217636108 + }, + "opacity": 1, + "type": "SOLID", + "visible": true + }, + { + "blendMode": "NORMAL", + "filters": { + "contrast": 0, + "exposure": 0, + "highlights": 0, + "saturation": 0, + "shadows": 0, + "temperature": 0, + "tint": 0 + }, + "imageHash": "5b094cfd23e732669774034eb6fcfe3a26f7dc63", + "imageTransform": [ + [ + 1.0957937240600586, + 0, + -0.051260415464639664 + ], + [ + 0, + 0.9575611352920532, + -0.011001000180840492 + ] + ], + "opacity": 1, + "scaleMode": "CROP", + "scalingFactor": 0.5, + "type": "IMAGE", + "visible": true + } + ], + "childIds": [], + "assetSha256": "d966f8f5ee2c191a163fdb4a6b43c0f579b7f1811961fbda7362f927217d4ad5", + "referenceSha256": "6dc173242afb2bc5ad5d7262d4d23acd1ec7fcc468db32c413cc5356b3dd9120", + "exportVsReferenceChangedPixels": 0, + "actualSha256": "1ff44ea5a12777ee3c5f13e8bc0edc5a1aca42c5d6cea8ae2f426438c91a9145", + "actualVsReferenceChangedPixels": 2105 + } + ], + "binarySha256": "21f41954f76d4fe1fbe867191156fc8cc574879885062f792bdd830a95af8cf8" + }, + "liveAssetProbe": { + "tool": "figma.download_assets", + "fileKey": "f1AJyo27afkkr6U9PhnWSu", + "nodeId": "422:3378", + "status": "UNAUTHORIZED", + "message": "This app connection requires reauthentication before other actions on this app can succeed." + }, + "koreanAllowancePp": 0.21, + "mobileResidualExcludingAllowancePp": 5.221783302639656, + "bridgeTestFirst": { + "red": { + "passed": 2, + "failed": 1, + "failure": "Successful native PNG export (exports=1) becomes DEVUP_ASSET_EXPORT_FAILED because figma.io writer is absent.", + "logSha256": "4e09de6640efd3cab0e5cd1926dee57fca67acc2640b3461507eea947cdfeb73" + }, + "green": { + "passed": 3, + "failed": 0, + "logSha256": "87824aeed8b3c74c14666b9fa98ae1509808a2a4e75e168ccb9f4b64e0bbb789" + }, + "generatedPluginProbe": { + "kind": "devupAssetExport", + "fileKey": "fixture", + "assetId": "1:2:node", + "nodeId": "1:2", + "field": "node", + "format": "png", + "scale": 1, + "status": "exported", + "byteLength": 3, + "sha256": "039058c6f2c0cb492c533b0a4d14ef77cc0f78abccced5287d84a1a2011cfb81", + "mimeType": "image/png", + "data": "AQID", + "text": null, + "errorCode": null + } + }, + "invalidAcquisitions": [ + "Initial empty harness theme acquisition refused DEVUP_THEME_CONFLICT; copied established devup.json seed, then target acquisition rewrote node themes.", + "Initial incomplete exported-asset cache left missing SVG files; acquisition stopped and replaced after copying existing exported cache." + ], + "productionPixelFix": false, + "thresholdsChanged": false, + "pluginGoldensChanged": [], + "candidateFirstActualHashes": { + "about-422-3376": "b5b4811070234e052c2f0ecbf2405ecced400aa14a0813661c2331a70899505b", + "about-422-3180": "ea08e788ce5c65d1d2c6377a022a3934c6d0707ec1a4c73eedb690c6161627a2", + "about-422-2987": "1ff44ea5a12777ee3c5f13e8bc0edc5a1aca42c5d6cea8ae2f426438c91a9145" + }, + "candidateBinarySha256": "c3a5855d2fd50dc07ba712662378ff932c9d0657c9d20a4337d405579ef7fe60", + "candidateRuns": [ + [ + { + "name": "about-422-3376", + "viewport": { + "width": 360, + "height": 7240 + }, + "rendered": { + "width": 360, + "height": 7240 + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 360, + 7240 + ], + "actualDimensions": [ + 360, + 7240 + ], + "changedPixels": 141574, + "totalPixels": 2606400, + "changedRatio": 0.05431783302639656, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 238, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W24-A-hero-export\\harness\\render\\out\\about-422-3376.diff.png" + }, + "environmentStatus": "valid", + "themeHash": "67d6de70e67967432dcafb51a491b2105f11f5f5024cb4f79e1c8aa29b3503b7" + }, + { + "name": "about-422-3180", + "viewport": { + "width": 992, + "height": 5619 + }, + "rendered": { + "width": 992, + "height": 5620 + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 992, + 5619 + ], + "actualDimensions": [ + 992, + 5619 + ], + "changedPixels": 163529, + "totalPixels": 5574048, + "changedRatio": 0.02933756580495898, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 238, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W24-A-hero-export\\harness\\render\\out\\about-422-3180.diff.png" + }, + "environmentStatus": "valid", + "themeHash": "67d6de70e67967432dcafb51a491b2105f11f5f5024cb4f79e1c8aa29b3503b7" + }, + { + "name": "about-422-2987", + "viewport": { + "width": 1920, + "height": 4757 + }, + "rendered": { + "width": 1920, + "height": 4758 + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 1920, + 4757 + ], + "actualDimensions": [ + 1920, + 4757 + ], + "changedPixels": 161504, + "totalPixels": 9133440, + "changedRatio": 0.01768271319459043, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 238, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W24-A-hero-export\\harness\\render\\out\\about-422-2987.diff.png" + }, + "environmentStatus": "valid", + "themeHash": "67d6de70e67967432dcafb51a491b2105f11f5f5024cb4f79e1c8aa29b3503b7" + } + ], + [ + { + "name": "about-422-3376", + "viewport": { + "width": 360, + "height": 7240 + }, + "rendered": { + "width": 360, + "height": 7240 + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 360, + 7240 + ], + "actualDimensions": [ + 360, + 7240 + ], + "changedPixels": 141574, + "totalPixels": 2606400, + "changedRatio": 0.05431783302639656, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 238, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W24-A-hero-export\\harness\\render\\out\\about-422-3376.diff.png" + }, + "environmentStatus": "valid", + "themeHash": "67d6de70e67967432dcafb51a491b2105f11f5f5024cb4f79e1c8aa29b3503b7" + }, + { + "name": "about-422-3180", + "viewport": { + "width": 992, + "height": 5619 + }, + "rendered": { + "width": 992, + "height": 5620 + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 992, + 5619 + ], + "actualDimensions": [ + 992, + 5619 + ], + "changedPixels": 163529, + "totalPixels": 5574048, + "changedRatio": 0.02933756580495898, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 238, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W24-A-hero-export\\harness\\render\\out\\about-422-3180.diff.png" + }, + "environmentStatus": "valid", + "themeHash": "67d6de70e67967432dcafb51a491b2105f11f5f5024cb4f79e1c8aa29b3503b7" + }, + { + "name": "about-422-2987", + "viewport": { + "width": 1920, + "height": 4757 + }, + "rendered": { + "width": 1920, + "height": 4758 + }, + "metrics": { + "status": "mismatch", + "referenceDimensions": [ + 1920, + 4757 + ], + "actualDimensions": [ + 1920, + 4757 + ], + "changedPixels": 161504, + "totalPixels": 9133440, + "changedRatio": 0.01768271319459043, + "maxChangedRatio": 0.005, + "channelTolerance": 24, + "maxChannelDelta": 238, + "diffPath": "C:\\Users\\owjs3\\orca\\workspaces\\devup-mcp\\W24-A-hero-export\\harness\\render\\out\\about-422-2987.diff.png" + }, + "environmentStatus": "valid", + "themeHash": "67d6de70e67967432dcafb51a491b2105f11f5f5024cb4f79e1c8aa29b3503b7" + } + ] + ], + "candidateAcquisitionFiles": { + "about-422-3376": { + "src/screens/about-422-3376.tsx": "72d92ac544a77e758fb6547b2085b984d82728cb814bcc2a0a25a7bc2b73827c", + "themes/about-422-3376.json": "67d6de70e67967432dcafb51a491b2105f11f5f5024cb4f79e1c8aa29b3503b7", + "out/about-422-3376.reference.png": "183b29572ab786dbe588e0bfed57db8210920e4f070dfb22226065a6545c17f8", + "out/about-422-3376-422-3376.snapshot.json": "6e68ee5121616f01497345619f8185f6c37fdab363d9132c388738fdd599ebdd", + "public/images/Section1-422-2989.png": "40b072777cb9dde85763e63e029239cb1d7e14409f8b316d7283697abcc53868", + "public/images/2-1-422-2991-04c06818b22f.png": "e6015ba1c9fb9303d471cf0eb7405afa8e255825684f506b7a0a53ff93fe9c8e", + "public/images/Frame-269-422-2996-e302b6b111d4.png": "6a0ae8afa45e6b73a2620d0545a7fed0445ff52515377d8b85db4889db2906ce", + "public/icons/file-analytic_14427169-1-422-3010-c18bf91459ac.svg": "9d7d47743459dc88c3f484fdbb53a5bb73fb1be608ba3a6852fcda731f144614", + "public/icons/shopping-list_1288709-1-422-3028-21f19fe34057.svg": "e94970ba54e1861da6777e7f8c1094161e9958c3cd7b43fb3ea73cd771cc6a12", + "public/icons/meeting_1621655-1-422-3059-fbf10cffffdc.svg": "3380c956ec0a7935618109ea320b56b56c8821f0e3d34023fa8a982998df1133", + "public/icons/422-3095-55250514fb17.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3097-0d37556a31a6.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/icons/puzzle_17833563-1-422-3100-68fcd7ce5191.svg": "f853f0aa03903d26ff4ac0658f81eaa357b78b9881b2e8d2c47ac345e879e38e", + "public/images/Frame-1000014115-422-3106-47c4161cbfdc.png": "dd6cb90a65d7ed388b93a7e3ce60b6c4138c54d23a5e24867ce02720b56202a1", + "public/images/Frame-256-422-3125-2-176f1c6fe3ab.png": "d966f8f5ee2c191a163fdb4a6b43c0f579b7f1811961fbda7362f927217d4ad5", + "public/icons/Frame-287-422-3133-3ccb13ba51fd.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3137-5e3d7d6e17fd.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3141-107eb1e2beea.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-257-422-3145-2-357f7710ea85.png": "5cf8ab0f1b8cd7b6c70ef03b2d3e15b2c7f67a9e3cb6013d1915c92c6e0cab88", + "public/icons/Frame-287-422-3150-12eb2516b4d2.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3154-a2eb9f1af7d7.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3158-4f13a54de65b.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-258-422-3162-2-e27c69996ca2.png": "f746a34333dfd09fc0507092b27c5300a0c76ec9d44e0ec87d712a410f8ef33b", + "public/icons/Frame-287-422-3167-54ec1d92f274.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-259-422-3171-2-a35dcd9fae03.png": "f6d9ffdbac3cc6d48554c6278019cb6a6184cb10d4670a3b7342808beec3d937", + "public/icons/Frame-287-422-3176-97916df902d3.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Section1-422-3183.png": "7720dc3e1f4c9659ffe9fe55604e4bdac5db1e04a7dad88d70890e3c9e7a9fe8", + "public/images/2-1-422-3185-c2c2bb9fd4ca.png": "1c38f71561ca2fd4aefa625958d9101e178e1540887049db544c37884f22dc79", + "public/images/Frame-269-422-3190-fd04b8b6b1f3.png": "47be398c71c507eede8a2545697ea8db2fe60a9cd2dbfe4d4ef777e7852454b3", + "public/icons/file-analytic_14427169-1-422-3204-432c13ca99bd.svg": "9d7d47743459dc88c3f484fdbb53a5bb73fb1be608ba3a6852fcda731f144614", + "public/icons/shopping-list_1288709-1-422-3222-b3e9e8487485.svg": "c7a372e75e151f942986fbe8a32a4b1a002ed0f105462a2284b3304d50af77ba", + "public/icons/meeting_1621655-1-422-3253-298cce04954e.svg": "39c1f190f5337a2ef2131d345ecb1cc385d7360861d517111901def4511fe106", + "public/icons/422-3289-1341670f1470.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3291-f455a67c7691.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/icons/puzzle_17833563-1-422-3294-2f23118b8931.svg": "b30a7b5201b6438bbe3fa0eede1f571bc14f7ca53cbb3e7cd6f073a1c7dea28a", + "public/images/Frame-1000014115-422-3300-897dd4548a76.png": "0f14e1f6ba38c889b2a79213a07671cbc7ff77bc64bf0b684ab5d828b0e47ff0", + "public/images/Frame-256-422-3320-2-2f4ae32bf58f.png": "d966f8f5ee2c191a163fdb4a6b43c0f579b7f1811961fbda7362f927217d4ad5", + "public/icons/Frame-287-422-3328-3a4711366ec2.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3332-afb9a56cd5bf.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3336-2f9cf19d6dce.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-257-422-3340-2-a9b56c699b23.png": "5cf8ab0f1b8cd7b6c70ef03b2d3e15b2c7f67a9e3cb6013d1915c92c6e0cab88", + "public/icons/Frame-287-422-3345-d5b693523dde.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3349-0d8a14703259.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3353-eaa50e1d86e7.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-258-422-3358-2-0adcc70fa0d7.png": "f746a34333dfd09fc0507092b27c5300a0c76ec9d44e0ec87d712a410f8ef33b", + "public/icons/Frame-287-422-3363-2b09fc7a41f0.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-259-422-3367-2-4d462c68adbb.png": "f6d9ffdbac3cc6d48554c6278019cb6a6184cb10d4670a3b7342808beec3d937", + "public/icons/Frame-287-422-3372-240bfbcd93a8.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Section1-422-3378.png": "ba4cd45f211bb5e4e73d4bf75981f6f2aed04575e1b82fbb4afbb09c80a92c1c", + "public/images/2-1-422-3380-cb2a0042a641.png": "a6604f6a23668a36fe7669bb7dae27e1303241e319ec3c5fc004cef912a4df27", + "public/images/Frame-269-422-3392-5be2d3573dd4.png": "856609c2b24d369580edb5cb87430ad33ea8fbc3f5a559fe8e9969c70b781931", + "public/icons/file-analytic_14427169-1-422-3399-139dd88e7135.svg": "0071bed431ba0fd316d73e20f975881603c259cbcd21ed7c1c6c327cd5a115b9", + "public/icons/shopping-list_1288709-1-422-3417-791e321745e1.svg": "03466401cfb2bdba43054fab1e191393bcf405cb23987e40ff32f20ebd264ab8", + "public/icons/meeting_1621655-1-422-3448-05d5b482e0b5.svg": "cbe97ff3f21e401fdea44bd56b50deb907688d9fe70a6ac359c43f72c8b0cb72", + "public/icons/puzzle_17833563-1-422-3481-a67ca4e245af.svg": "9e48c170db858584703aa6a6ad8ef1d87497787be9d78ae7e0b97ac707436b7d", + "public/icons/422-3486-2489fb200011.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3488-1c4e20055c2e.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/images/Frame-1000014115-422-3495-753f13b2e0dd.png": "8dbde872e57446334285215e31b7ce62888ecc6f734ef80d0b0cbf043fa71ab8", + "public/images/Frame-256-422-3514-2-ef1ce40418b8.png": "85a1ac763f2ba75cf4439afe43c79e93d3b9223698e5ddd6f27f7abfc44f5ff6", + "public/icons/Frame-287-422-3522-69bff93d7324.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3526-6b5842e92a01.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3530-14f6769de568.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-257-422-3534-2-48ea6bc9848a.png": "1ea58b9e09a248bcfa987612c7c9525cd5ac91c162d284c4ecfb163c135e3e7b", + "public/icons/Frame-287-422-3539-b40757ac8c31.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3543-518a0dce63b4.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3547-71792e0420f0.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-258-422-3551-2-212ce23b8c62.png": "bb6358a55187f71806b213afa22a8a631290f7643caa60099d70316682a4e42b", + "public/icons/Frame-287-422-3556-ef8452af3a3e.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-259-422-3560-2-502893d58465.png": "fbe4631ff8bd6375993763bb6c0e8cbd5c4cfe8bd27ec9e3765a2add021d43b9", + "public/icons/Frame-287-422-3565-d40d8a2c65bb.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-1000014286-I422-2988-935-102168-8297aaad000c.svg": "ffb8c9aa5bf5391a72f128243a4a31a4a1bb51f916ef9016c8c5ee65856e3972", + "public/icons/Container-I422-3179-1127-78173.svg": "8f3c2a9c29107bb5dce6c10f48884e532c086bf8cc85eed8e5495edc5dcdca0c", + "public/icons/Icons-location-60eb5ab59e5e.svg": "d3941032c41126ef38a5c1e529a4300029c2514f827b84319c54f87def94b031", + "public/icons/Icons-tel-b5d1fc7747cd.svg": "89a41a35802eb8d04d6716354e1d7058105fc13b8743210a0a7a4fbb18882493", + "public/icons/Icons-email-c8a6dae31bb4.svg": "1dcb7f565b0412e496f625d248ce973abc44b545b9ed7015644deaf0d6fac8ca", + "public/icons/Icons-insta-8f3f8e048fd3.svg": "5ccbd4b5ddacef31234d53d90993935ea6e65f138f31c607ee77b1c0c17954ed", + "public/icons/Icons-mention-a09d585d05ef.svg": "6a55243c947343a2d9d67a42382017a1fdf91ec52756833bdb8b9c583bb6eb53", + "public/icons/Icons-docs-7356013800c3.svg": "acad8716a68f6071b024beccd78080560cff32b1c3ee1a84082d75a360b7ec5e", + "public/icons/Frame-1000014286-I422-3182-935-102168-a94614c9360a.svg": "ffb8c9aa5bf5391a72f128243a4a31a4a1bb51f916ef9016c8c5ee65856e3972", + "public/icons/Container-I422-3375-1127-78173.svg": "8f3c2a9c29107bb5dce6c10f48884e532c086bf8cc85eed8e5495edc5dcdca0c", + "public/icons/Icons-hamburger-cf989eed2cd8.svg": "ac9e2bfeabbaa0102254d8f53bc597888c73af1e226ae0c4bc381ce90f1132d3", + "public/icons/Frame-1000014285-I422-3377-935-101749-cfb195196c6c.svg": "8a0565afa4709169455563a507331af0f1994406746f2f27b3c56f60dc265c77", + "public/icons/P-I422-3568-277-7767.svg": "682a7fb16df448d4c9435bcaf6306e79761e737490e852190478246303414c37", + "public/icons/Icons-arrow-abf22ae153b4.svg": "830d5a696d483574fe3c11135427ff47c9cb86f85984de47b694e64deef7c05c" + }, + "about-422-3180": { + "src/screens/about-422-3180.tsx": "c9f36e5ee08596368962f0872314b74fd7d83ce2f9e32c230400b3e1477ccb92", + "themes/about-422-3180.json": "67d6de70e67967432dcafb51a491b2105f11f5f5024cb4f79e1c8aa29b3503b7", + "out/about-422-3180.reference.png": "9487389f99ba9d199262ddf0c0e8acaed0679b0aadceeb535cecb99f6b3e1faa", + "out/about-422-3180-422-3180.snapshot.json": "6e68ee5121616f01497345619f8185f6c37fdab363d9132c388738fdd599ebdd", + "public/images/Section1-422-2989.png": "40b072777cb9dde85763e63e029239cb1d7e14409f8b316d7283697abcc53868", + "public/images/2-1-422-2991-04c06818b22f.png": "e6015ba1c9fb9303d471cf0eb7405afa8e255825684f506b7a0a53ff93fe9c8e", + "public/images/Frame-269-422-2996-e302b6b111d4.png": "6a0ae8afa45e6b73a2620d0545a7fed0445ff52515377d8b85db4889db2906ce", + "public/icons/file-analytic_14427169-1-422-3010-c18bf91459ac.svg": "9d7d47743459dc88c3f484fdbb53a5bb73fb1be608ba3a6852fcda731f144614", + "public/icons/shopping-list_1288709-1-422-3028-21f19fe34057.svg": "e94970ba54e1861da6777e7f8c1094161e9958c3cd7b43fb3ea73cd771cc6a12", + "public/icons/meeting_1621655-1-422-3059-fbf10cffffdc.svg": "3380c956ec0a7935618109ea320b56b56c8821f0e3d34023fa8a982998df1133", + "public/icons/422-3095-55250514fb17.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3097-0d37556a31a6.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/icons/puzzle_17833563-1-422-3100-68fcd7ce5191.svg": "f853f0aa03903d26ff4ac0658f81eaa357b78b9881b2e8d2c47ac345e879e38e", + "public/images/Frame-1000014115-422-3106-47c4161cbfdc.png": "dd6cb90a65d7ed388b93a7e3ce60b6c4138c54d23a5e24867ce02720b56202a1", + "public/images/Frame-256-422-3125-2-176f1c6fe3ab.png": "d966f8f5ee2c191a163fdb4a6b43c0f579b7f1811961fbda7362f927217d4ad5", + "public/icons/Frame-287-422-3133-3ccb13ba51fd.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3137-5e3d7d6e17fd.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3141-107eb1e2beea.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-257-422-3145-2-357f7710ea85.png": "5cf8ab0f1b8cd7b6c70ef03b2d3e15b2c7f67a9e3cb6013d1915c92c6e0cab88", + "public/icons/Frame-287-422-3150-12eb2516b4d2.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3154-a2eb9f1af7d7.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3158-4f13a54de65b.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-258-422-3162-2-e27c69996ca2.png": "f746a34333dfd09fc0507092b27c5300a0c76ec9d44e0ec87d712a410f8ef33b", + "public/icons/Frame-287-422-3167-54ec1d92f274.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-259-422-3171-2-a35dcd9fae03.png": "f6d9ffdbac3cc6d48554c6278019cb6a6184cb10d4670a3b7342808beec3d937", + "public/icons/Frame-287-422-3176-97916df902d3.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Section1-422-3183.png": "7720dc3e1f4c9659ffe9fe55604e4bdac5db1e04a7dad88d70890e3c9e7a9fe8", + "public/images/2-1-422-3185-c2c2bb9fd4ca.png": "1c38f71561ca2fd4aefa625958d9101e178e1540887049db544c37884f22dc79", + "public/images/Frame-269-422-3190-fd04b8b6b1f3.png": "47be398c71c507eede8a2545697ea8db2fe60a9cd2dbfe4d4ef777e7852454b3", + "public/icons/file-analytic_14427169-1-422-3204-432c13ca99bd.svg": "9d7d47743459dc88c3f484fdbb53a5bb73fb1be608ba3a6852fcda731f144614", + "public/icons/shopping-list_1288709-1-422-3222-b3e9e8487485.svg": "c7a372e75e151f942986fbe8a32a4b1a002ed0f105462a2284b3304d50af77ba", + "public/icons/meeting_1621655-1-422-3253-298cce04954e.svg": "39c1f190f5337a2ef2131d345ecb1cc385d7360861d517111901def4511fe106", + "public/icons/422-3289-1341670f1470.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3291-f455a67c7691.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/icons/puzzle_17833563-1-422-3294-2f23118b8931.svg": "b30a7b5201b6438bbe3fa0eede1f571bc14f7ca53cbb3e7cd6f073a1c7dea28a", + "public/images/Frame-1000014115-422-3300-897dd4548a76.png": "0f14e1f6ba38c889b2a79213a07671cbc7ff77bc64bf0b684ab5d828b0e47ff0", + "public/images/Frame-256-422-3320-2-2f4ae32bf58f.png": "d966f8f5ee2c191a163fdb4a6b43c0f579b7f1811961fbda7362f927217d4ad5", + "public/icons/Frame-287-422-3328-3a4711366ec2.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3332-afb9a56cd5bf.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3336-2f9cf19d6dce.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-257-422-3340-2-a9b56c699b23.png": "5cf8ab0f1b8cd7b6c70ef03b2d3e15b2c7f67a9e3cb6013d1915c92c6e0cab88", + "public/icons/Frame-287-422-3345-d5b693523dde.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3349-0d8a14703259.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3353-eaa50e1d86e7.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-258-422-3358-2-0adcc70fa0d7.png": "f746a34333dfd09fc0507092b27c5300a0c76ec9d44e0ec87d712a410f8ef33b", + "public/icons/Frame-287-422-3363-2b09fc7a41f0.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-259-422-3367-2-4d462c68adbb.png": "f6d9ffdbac3cc6d48554c6278019cb6a6184cb10d4670a3b7342808beec3d937", + "public/icons/Frame-287-422-3372-240bfbcd93a8.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Section1-422-3378.png": "ba4cd45f211bb5e4e73d4bf75981f6f2aed04575e1b82fbb4afbb09c80a92c1c", + "public/images/2-1-422-3380-cb2a0042a641.png": "a6604f6a23668a36fe7669bb7dae27e1303241e319ec3c5fc004cef912a4df27", + "public/images/Frame-269-422-3392-5be2d3573dd4.png": "856609c2b24d369580edb5cb87430ad33ea8fbc3f5a559fe8e9969c70b781931", + "public/icons/file-analytic_14427169-1-422-3399-139dd88e7135.svg": "0071bed431ba0fd316d73e20f975881603c259cbcd21ed7c1c6c327cd5a115b9", + "public/icons/shopping-list_1288709-1-422-3417-791e321745e1.svg": "03466401cfb2bdba43054fab1e191393bcf405cb23987e40ff32f20ebd264ab8", + "public/icons/meeting_1621655-1-422-3448-05d5b482e0b5.svg": "cbe97ff3f21e401fdea44bd56b50deb907688d9fe70a6ac359c43f72c8b0cb72", + "public/icons/puzzle_17833563-1-422-3481-a67ca4e245af.svg": "9e48c170db858584703aa6a6ad8ef1d87497787be9d78ae7e0b97ac707436b7d", + "public/icons/422-3486-2489fb200011.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3488-1c4e20055c2e.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/images/Frame-1000014115-422-3495-753f13b2e0dd.png": "8dbde872e57446334285215e31b7ce62888ecc6f734ef80d0b0cbf043fa71ab8", + "public/images/Frame-256-422-3514-2-ef1ce40418b8.png": "85a1ac763f2ba75cf4439afe43c79e93d3b9223698e5ddd6f27f7abfc44f5ff6", + "public/icons/Frame-287-422-3522-69bff93d7324.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3526-6b5842e92a01.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3530-14f6769de568.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-257-422-3534-2-48ea6bc9848a.png": "1ea58b9e09a248bcfa987612c7c9525cd5ac91c162d284c4ecfb163c135e3e7b", + "public/icons/Frame-287-422-3539-b40757ac8c31.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3543-518a0dce63b4.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3547-71792e0420f0.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-258-422-3551-2-212ce23b8c62.png": "bb6358a55187f71806b213afa22a8a631290f7643caa60099d70316682a4e42b", + "public/icons/Frame-287-422-3556-ef8452af3a3e.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-259-422-3560-2-502893d58465.png": "fbe4631ff8bd6375993763bb6c0e8cbd5c4cfe8bd27ec9e3765a2add021d43b9", + "public/icons/Frame-287-422-3565-d40d8a2c65bb.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-1000014286-I422-2988-935-102168-8297aaad000c.svg": "ffb8c9aa5bf5391a72f128243a4a31a4a1bb51f916ef9016c8c5ee65856e3972", + "public/icons/Container-I422-3179-1127-78173.svg": "8f3c2a9c29107bb5dce6c10f48884e532c086bf8cc85eed8e5495edc5dcdca0c", + "public/icons/Icons-location-60eb5ab59e5e.svg": "d3941032c41126ef38a5c1e529a4300029c2514f827b84319c54f87def94b031", + "public/icons/Icons-tel-b5d1fc7747cd.svg": "89a41a35802eb8d04d6716354e1d7058105fc13b8743210a0a7a4fbb18882493", + "public/icons/Icons-email-c8a6dae31bb4.svg": "1dcb7f565b0412e496f625d248ce973abc44b545b9ed7015644deaf0d6fac8ca", + "public/icons/Icons-insta-8f3f8e048fd3.svg": "5ccbd4b5ddacef31234d53d90993935ea6e65f138f31c607ee77b1c0c17954ed", + "public/icons/Icons-mention-a09d585d05ef.svg": "6a55243c947343a2d9d67a42382017a1fdf91ec52756833bdb8b9c583bb6eb53", + "public/icons/Icons-docs-7356013800c3.svg": "acad8716a68f6071b024beccd78080560cff32b1c3ee1a84082d75a360b7ec5e", + "public/icons/Frame-1000014286-I422-3182-935-102168-a94614c9360a.svg": "ffb8c9aa5bf5391a72f128243a4a31a4a1bb51f916ef9016c8c5ee65856e3972", + "public/icons/Container-I422-3375-1127-78173.svg": "8f3c2a9c29107bb5dce6c10f48884e532c086bf8cc85eed8e5495edc5dcdca0c", + "public/icons/Icons-hamburger-cf989eed2cd8.svg": "ac9e2bfeabbaa0102254d8f53bc597888c73af1e226ae0c4bc381ce90f1132d3", + "public/icons/Frame-1000014285-I422-3377-935-101749-cfb195196c6c.svg": "8a0565afa4709169455563a507331af0f1994406746f2f27b3c56f60dc265c77", + "public/icons/P-I422-3568-277-7767.svg": "682a7fb16df448d4c9435bcaf6306e79761e737490e852190478246303414c37", + "public/icons/Icons-arrow-abf22ae153b4.svg": "830d5a696d483574fe3c11135427ff47c9cb86f85984de47b694e64deef7c05c" + }, + "about-422-2987": { + "src/screens/about-422-2987.tsx": "e0c1ba3c07a85b4a785906a74383ec9c35480a7e95a8d81ecd3df2506fd5f7e6", + "themes/about-422-2987.json": "67d6de70e67967432dcafb51a491b2105f11f5f5024cb4f79e1c8aa29b3503b7", + "out/about-422-2987.reference.png": "6dc173242afb2bc5ad5d7262d4d23acd1ec7fcc468db32c413cc5356b3dd9120", + "out/about-422-2987-422-2987.snapshot.json": "6e68ee5121616f01497345619f8185f6c37fdab363d9132c388738fdd599ebdd", + "public/images/Section1-422-2989.png": "40b072777cb9dde85763e63e029239cb1d7e14409f8b316d7283697abcc53868", + "public/images/2-1-422-2991-04c06818b22f.png": "e6015ba1c9fb9303d471cf0eb7405afa8e255825684f506b7a0a53ff93fe9c8e", + "public/images/Frame-269-422-2996-e302b6b111d4.png": "6a0ae8afa45e6b73a2620d0545a7fed0445ff52515377d8b85db4889db2906ce", + "public/icons/file-analytic_14427169-1-422-3010-c18bf91459ac.svg": "9d7d47743459dc88c3f484fdbb53a5bb73fb1be608ba3a6852fcda731f144614", + "public/icons/shopping-list_1288709-1-422-3028-21f19fe34057.svg": "e94970ba54e1861da6777e7f8c1094161e9958c3cd7b43fb3ea73cd771cc6a12", + "public/icons/meeting_1621655-1-422-3059-fbf10cffffdc.svg": "3380c956ec0a7935618109ea320b56b56c8821f0e3d34023fa8a982998df1133", + "public/icons/422-3095-55250514fb17.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3097-0d37556a31a6.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/icons/puzzle_17833563-1-422-3100-68fcd7ce5191.svg": "f853f0aa03903d26ff4ac0658f81eaa357b78b9881b2e8d2c47ac345e879e38e", + "public/images/Frame-1000014115-422-3106-47c4161cbfdc.png": "dd6cb90a65d7ed388b93a7e3ce60b6c4138c54d23a5e24867ce02720b56202a1", + "public/images/Frame-256-422-3125-2-176f1c6fe3ab.png": "d966f8f5ee2c191a163fdb4a6b43c0f579b7f1811961fbda7362f927217d4ad5", + "public/icons/Frame-287-422-3133-3ccb13ba51fd.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3137-5e3d7d6e17fd.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3141-107eb1e2beea.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-257-422-3145-2-357f7710ea85.png": "5cf8ab0f1b8cd7b6c70ef03b2d3e15b2c7f67a9e3cb6013d1915c92c6e0cab88", + "public/icons/Frame-287-422-3150-12eb2516b4d2.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3154-a2eb9f1af7d7.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3158-4f13a54de65b.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-258-422-3162-2-e27c69996ca2.png": "f746a34333dfd09fc0507092b27c5300a0c76ec9d44e0ec87d712a410f8ef33b", + "public/icons/Frame-287-422-3167-54ec1d92f274.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-259-422-3171-2-a35dcd9fae03.png": "f6d9ffdbac3cc6d48554c6278019cb6a6184cb10d4670a3b7342808beec3d937", + "public/icons/Frame-287-422-3176-97916df902d3.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Section1-422-3183.png": "7720dc3e1f4c9659ffe9fe55604e4bdac5db1e04a7dad88d70890e3c9e7a9fe8", + "public/images/2-1-422-3185-c2c2bb9fd4ca.png": "1c38f71561ca2fd4aefa625958d9101e178e1540887049db544c37884f22dc79", + "public/images/Frame-269-422-3190-fd04b8b6b1f3.png": "47be398c71c507eede8a2545697ea8db2fe60a9cd2dbfe4d4ef777e7852454b3", + "public/icons/file-analytic_14427169-1-422-3204-432c13ca99bd.svg": "9d7d47743459dc88c3f484fdbb53a5bb73fb1be608ba3a6852fcda731f144614", + "public/icons/shopping-list_1288709-1-422-3222-b3e9e8487485.svg": "c7a372e75e151f942986fbe8a32a4b1a002ed0f105462a2284b3304d50af77ba", + "public/icons/meeting_1621655-1-422-3253-298cce04954e.svg": "39c1f190f5337a2ef2131d345ecb1cc385d7360861d517111901def4511fe106", + "public/icons/422-3289-1341670f1470.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3291-f455a67c7691.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/icons/puzzle_17833563-1-422-3294-2f23118b8931.svg": "b30a7b5201b6438bbe3fa0eede1f571bc14f7ca53cbb3e7cd6f073a1c7dea28a", + "public/images/Frame-1000014115-422-3300-897dd4548a76.png": "0f14e1f6ba38c889b2a79213a07671cbc7ff77bc64bf0b684ab5d828b0e47ff0", + "public/images/Frame-256-422-3320-2-2f4ae32bf58f.png": "d966f8f5ee2c191a163fdb4a6b43c0f579b7f1811961fbda7362f927217d4ad5", + "public/icons/Frame-287-422-3328-3a4711366ec2.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3332-afb9a56cd5bf.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3336-2f9cf19d6dce.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-257-422-3340-2-a9b56c699b23.png": "5cf8ab0f1b8cd7b6c70ef03b2d3e15b2c7f67a9e3cb6013d1915c92c6e0cab88", + "public/icons/Frame-287-422-3345-d5b693523dde.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3349-0d8a14703259.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/icons/Frame-287-422-3353-eaa50e1d86e7.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-258-422-3358-2-0adcc70fa0d7.png": "f746a34333dfd09fc0507092b27c5300a0c76ec9d44e0ec87d712a410f8ef33b", + "public/icons/Frame-287-422-3363-2b09fc7a41f0.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Frame-259-422-3367-2-4d462c68adbb.png": "f6d9ffdbac3cc6d48554c6278019cb6a6184cb10d4670a3b7342808beec3d937", + "public/icons/Frame-287-422-3372-240bfbcd93a8.svg": "5e4717de1dd25812cae9b40cef398aedab2d9e4426dd202ea563987e7151fd9c", + "public/images/Section1-422-3378.png": "ba4cd45f211bb5e4e73d4bf75981f6f2aed04575e1b82fbb4afbb09c80a92c1c", + "public/images/2-1-422-3380-cb2a0042a641.png": "a6604f6a23668a36fe7669bb7dae27e1303241e319ec3c5fc004cef912a4df27", + "public/images/Frame-269-422-3392-5be2d3573dd4.png": "856609c2b24d369580edb5cb87430ad33ea8fbc3f5a559fe8e9969c70b781931", + "public/icons/file-analytic_14427169-1-422-3399-139dd88e7135.svg": "0071bed431ba0fd316d73e20f975881603c259cbcd21ed7c1c6c327cd5a115b9", + "public/icons/shopping-list_1288709-1-422-3417-791e321745e1.svg": "03466401cfb2bdba43054fab1e191393bcf405cb23987e40ff32f20ebd264ab8", + "public/icons/meeting_1621655-1-422-3448-05d5b482e0b5.svg": "cbe97ff3f21e401fdea44bd56b50deb907688d9fe70a6ac359c43f72c8b0cb72", + "public/icons/puzzle_17833563-1-422-3481-a67ca4e245af.svg": "9e48c170db858584703aa6a6ad8ef1d87497787be9d78ae7e0b97ac707436b7d", + "public/icons/422-3486-2489fb200011.svg": "615f28af103729b40141009d91aefa110f95aa2a7b63fcc02f5bb4ab92a74a03", + "public/icons/422-3488-1c4e20055c2e.svg": "77a4d846fe533db462c77acc0732fffb71cc51b531cd082f4894fcab416db529", + "public/images/Frame-1000014115-422-3495-753f13b2e0dd.png": "8dbde872e57446334285215e31b7ce62888ecc6f734ef80d0b0cbf043fa71ab8", + "public/images/Frame-256-422-3514-2-ef1ce40418b8.png": "85a1ac763f2ba75cf4439afe43c79e93d3b9223698e5ddd6f27f7abfc44f5ff6", + "public/icons/Frame-287-422-3522-69bff93d7324.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3526-6b5842e92a01.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3530-14f6769de568.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-257-422-3534-2-48ea6bc9848a.png": "1ea58b9e09a248bcfa987612c7c9525cd5ac91c162d284c4ecfb163c135e3e7b", + "public/icons/Frame-287-422-3539-b40757ac8c31.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3543-518a0dce63b4.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-287-422-3547-71792e0420f0.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-258-422-3551-2-212ce23b8c62.png": "bb6358a55187f71806b213afa22a8a631290f7643caa60099d70316682a4e42b", + "public/icons/Frame-287-422-3556-ef8452af3a3e.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/images/Frame-259-422-3560-2-502893d58465.png": "fbe4631ff8bd6375993763bb6c0e8cbd5c4cfe8bd27ec9e3765a2add021d43b9", + "public/icons/Frame-287-422-3565-d40d8a2c65bb.svg": "26bc43fb3586541ebd6694fd32e4ac6449ec35b38613feb679a1d17b8b16df6e", + "public/icons/Frame-1000014286-I422-2988-935-102168-8297aaad000c.svg": "ffb8c9aa5bf5391a72f128243a4a31a4a1bb51f916ef9016c8c5ee65856e3972", + "public/icons/Container-I422-3179-1127-78173.svg": "8f3c2a9c29107bb5dce6c10f48884e532c086bf8cc85eed8e5495edc5dcdca0c", + "public/icons/Icons-location-60eb5ab59e5e.svg": "d3941032c41126ef38a5c1e529a4300029c2514f827b84319c54f87def94b031", + "public/icons/Icons-tel-b5d1fc7747cd.svg": "89a41a35802eb8d04d6716354e1d7058105fc13b8743210a0a7a4fbb18882493", + "public/icons/Icons-email-c8a6dae31bb4.svg": "1dcb7f565b0412e496f625d248ce973abc44b545b9ed7015644deaf0d6fac8ca", + "public/icons/Icons-insta-8f3f8e048fd3.svg": "5ccbd4b5ddacef31234d53d90993935ea6e65f138f31c607ee77b1c0c17954ed", + "public/icons/Icons-mention-a09d585d05ef.svg": "6a55243c947343a2d9d67a42382017a1fdf91ec52756833bdb8b9c583bb6eb53", + "public/icons/Icons-docs-7356013800c3.svg": "acad8716a68f6071b024beccd78080560cff32b1c3ee1a84082d75a360b7ec5e", + "public/icons/Frame-1000014286-I422-3182-935-102168-a94614c9360a.svg": "ffb8c9aa5bf5391a72f128243a4a31a4a1bb51f916ef9016c8c5ee65856e3972", + "public/icons/Container-I422-3375-1127-78173.svg": "8f3c2a9c29107bb5dce6c10f48884e532c086bf8cc85eed8e5495edc5dcdca0c", + "public/icons/Icons-hamburger-cf989eed2cd8.svg": "ac9e2bfeabbaa0102254d8f53bc597888c73af1e226ae0c4bc381ce90f1132d3", + "public/icons/Frame-1000014285-I422-3377-935-101749-cfb195196c6c.svg": "8a0565afa4709169455563a507331af0f1994406746f2f27b3c56f60dc265c77", + "public/icons/P-I422-3568-277-7767.svg": "682a7fb16df448d4c9435bcaf6306e79761e737490e852190478246303414c37", + "public/icons/Icons-arrow-abf22ae153b4.svg": "830d5a696d483574fe3c11135427ff47c9cb86f85984de47b694e64deef7c05c" + } + }, + "candidateRepeatActualHashes": { + "about-422-3376": "b5b4811070234e052c2f0ecbf2405ecced400aa14a0813661c2331a70899505b", + "about-422-3180": "ea08e788ce5c65d1d2c6377a022a3934c6d0707ec1a4c73eedb690c6161627a2", + "about-422-2987": "1ff44ea5a12777ee3c5f13e8bc0edc5a1aca42c5d6cea8ae2f426438c91a9145" + }, + "deltaChangedPixels": { + "about-422-3376": 0, + "about-422-3180": 0, + "about-422-2987": 0 + }, + "allAboutPngsByteIdenticalToBaseline": true, + "gate": { + "fmt": { + "exit": 0, + "logSha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + }, + "clippy": { + "exit": 0, + "logSha256": "bc92cd66d6e64b02642385a0997ebf6653e23f964e6583db577f9546eba6fcea", + "warnings": 0 + }, + "workspace": { + "exit": 0, + "logSha256": "c4f0cabeb75d794a51526b6def68076ada5e4fe2350f03f9d4feec3418cec69c", + "passed": 1115, + "failed": 0, + "ignored": 2 + }, + "insta": { + "exit": 0, + "logSha256": "b849fa2d7602008a26f46b259c980bf5bdde11a4d559da46cd31885617473342", + "passed": 1115, + "failed": 0, + "ignored": 2, + "pendingSnapshots": false + }, + "smoke": { + "exit": 0, + "logSha256": "8ddb25d938f4895b1a92f674e5cd60ab0b5a063a17958b6bee2d3d9b93cdd223", + "passed": 2, + "failed": 0, + "ignored": 0 + } + }, + "pluginBundleSha256": "b1b59a59e6a1a3b2161b307d96a61f767da8c825210681e1b38b1598fdbd77b6", + "pluginRebuildByteIdentical": true, + "pluginTypingsVersion": "1.138.0", + "visualComparatorSha256": "6f13a2329693e46fc3f872499ac0ded81e94c1f65ed84b01cc1fb1ed79daf0e4", + "environment": { + "CARGO_PROFILE_DEV_DEBUG": "0", + "CARGO_PROFILE_TEST_DEBUG": "0", + "CARGO_INCREMENTAL": "0", + "CARGO_BUILD_JOBS": "2", + "CARGO_TARGET_DIR": "never set", + "harnessScriptsChanged": false, + "ownTarget": true + }, + "bridgeFixCommit": "8ccc8da15718cc8a5f56db0ae63624877e816af5" +} \ No newline at end of file From 02253ab86b1ded0c526ab76f5d173366475b7376 Mon Sep 17 00:00:00 2001 From: owjs3901 Date: Mon, 14 Sep 2026 01:44:16 +0900 Subject: [PATCH 5/5] chore: record wave 24 as a changepack --- .changepacks/changepack_log_wave_24.json | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .changepacks/changepack_log_wave_24.json diff --git a/.changepacks/changepack_log_wave_24.json b/.changepacks/changepack_log_wave_24.json new file mode 100644 index 0000000..65c6543 --- /dev/null +++ b/.changepacks/changepack_log_wave_24.json @@ -0,0 +1,8 @@ +{ + "changes": { + "crates/devup-mcp-devup-ui/Cargo.toml": "Patch", + "crates/devup-mcp-figma/Cargo.toml": "Minor" + }, + "note": "Three screens looked at in parallel; two produced a fix and one produced a boundary. A responsive module folds the same node across breakpoints into one tree, and where the widths supplied different images it wrote the source as a responsive array. An image source is not a responsive value in the way a length is: the element takes one URL, so the array made a source no width had asked for. Differing child images now emit scalar URLs and lean on the visibility merging that already exists for nodes present at only some widths. Separately, the bridge's asset export called a remote figma.io writer that does not exist on the plugin path, which is why every asset request failed at a fixed delay; the transport now delivers bridge assets without it, with the decoder tests written red first and the committed plugin bundle rebuilt because assets.js is compiled into it. The isolated-fill contract the about hero needs is now defined and its boundary validated - all eleven existing crops and all three flattened hero exports match their reference regions - but isolating the hero itself still requires authenticated source pixels and representation-aware export continuation, so it is specified rather than claimed. The grid screen is a documented negative: all 41,234 differing pixels sit in three photographs and source-coordinate placement reproduces every one of them, which rules out the grid track projection outright and leaves density-aware raster mapping as the named next lead. No Rust changed for it. Measured against Figma's reference PNG the three popup screens improve from 3.64, 2.06 and 0.85 percent to 3.58, 2.02 and 0.84, with every other screen byte-identical and all 268 plugin goldens unchanged.", + "date": "2026-09-14T02:30:00+09:00" +}